gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 在一种形式上更新对象列表? (模型绑定(bind)到列表)

转载 作者:行者123 更新时间:2023-12-01 12:01:00 25 4
gpt4 key购买 nike

关于在 asp.net mvc 中更新项目列表的快速问题。

基本上,我有一个返回对象集合的编辑操作方法(顺便说一下,其表结构如下所示“testID、assetID、Result”——一个链接表)。

我基本上希望这些项目以一种形式一个接一个地显示并且能够编辑它们。表单应该回发,模型绑定(bind)器发挥它的魔力。但是,这并不容易。

我已经在网上搜索过了,似乎关于这个东西的大部分信息似乎都有点过时了。我遇到过this post ,很久没更新了,this one这似乎表明您不应绑定(bind)到已存在的列表进行更新,并且在使用 EF 或 Linq to Sql(我就是)时存在问题。

有没有一种简单的方法可以实现我想要的?发布版本中列表模型绑定(bind)的状态是否发生变化?

更新 - 更近一点......

这是我的编辑方法:

public ActionResult EditSurveyResults(Guid id)
{
var results = surveyRepository.GetSurveyResults(id);
return PartialView("EditSurveyResults", results);
}

还有我的表格:

<div id="editSurveyResults">
<h2>
EditSurveryResults</h2>

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm())
{%>
<fieldset>
<legend>Results</legend>
<% int i = 0; foreach (var result in Model)
{ %>

<input type="hidden" name='results[<%= i %>].TestID' value='<%= result.TestID %>' />
<input type="hidden" name='results[<%= i %>].AssetID' value='<%= result.AssetID %>' />
<p>
<%= result.Task.TaskName%>
</p>
<p>
<label for="Result">
Result:</label>
<input type="text" name='results[<%= i %>].Result' value='<%= result.Result %>' />
<%= Html.ValidationMessage("Result", "*")%>
</p>

<% i++; } %>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>

还有我的 Edit POST 方法:

 [AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditSurveyResults(Guid id, IList<SurveyTestResult> results)
{
var oldValues = surveyRepository.GetSurveyResults(id);

if (ModelState.IsValid)
{
UpdateModel(oldValues);
surveyRepository.Save();
return Content("Done");
}
else
return PartialView("EditSurveyResults");
}

它当然不完整,但它不会更新当前状态的任何内容。我在这里错过了一个把戏吗?结果中填充了更新后的实体,所以我不确定为什么它不更新...

更新 2:所以,我开始认为模型 Binder 不能做这样的事情。所以,我采取了一种更 hacky 的方式来做事。如果有人能发现这方面的问题,请告诉我。仅供引用 - 此表单将通过 AJAX 获取,因此我不会返回 View ,而是返回一条简单的消息。这是新代码:

IList<SurveyTestResult> oldValues = surveyRepository.GetSurveyResults(id).ToList();
foreach (var result in SurveyTestResult)
{
//SurveyTestResult is the IList that comes down from the form.
SurveyTestResult thisone = oldValues.Single(p => p.AssetID == result.AssetID &&
p.TestID == result.TestID);
//update the old entity with the result from the new one
thisone.Result = result.Result;
}

然后我在我的存储库上调用 Save。

提前致谢

最佳答案

我注意到的一件事是您没有渲染 <input type="hidden" name='results.Index' value='<%= i %>' />作为phil Haacks文章提及是强制性的。

切换到不同的 Modelbinder 也可能会成功。我使用 DataAnnotations 模型 Binder ,因此我不必生成 .Index绑定(bind)到 List 时的字段的。

关于asp.net-mvc - ASP.NET MVC 在一种形式上更新对象列表? (模型绑定(bind)到列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1565132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com