关于更新 ASP.NET MVC 中的项目列表的快速问题。
基本上我有一个编辑操作方法,它返回对象的集合(顺便说一句,其表结构如下所示“testID,assetID,Result” - 链接表)。
我基本上希望这些项目在表单中一个接一个地显示,并且能够编辑它们。表单应该发回,模型绑定器就会发挥它的魔力。但是,事情并不那么容易。
我已经在网上搜索过,似乎有关此内容的大部分信息似乎都有点过时了。我遇到过这个帖子 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx,已经很久没有更新了,this one http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx这似乎表明您不应该绑定到已存在的列表进行更新,并且使用 EF 或 Linq to Sql(我就是)时会出现问题。
有没有一种简单的方法可以实现我想要的?发布版本中列表模型绑定的状态是否发生了变化?
更新 - 更接近一点......
这是我的编辑方法:
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>
<% } %>
我的编辑 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:
所以,我开始认为模型绑定器不能做这样的事情。所以,我采取了一种更古怪的方式来做事。如果有人能发现此问题,请告诉我。仅供参考 - 该表单将通过 AJAX 获取,因此我不会返回视图,而是返回一条简单的消息。
这是新代码:
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。
提前致谢