3

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

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

我基本上希望这些项目在表单中一个接一个地显示并且能够编辑它们。表单应该回传,modelbinder 会发挥它的魔力。但是,这并不容易。

我已经在网上搜索过,似乎大多数关于这些东西的信息似乎有点过时了。我遇到过这篇文章,很久没有更新了,这篇文章似乎暗示你不应该绑定到已经存在的更新列表,并且在使用 EF 或 Linq 时会出现问题到 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。

提前致谢

4

1 回答 1

5

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

切换到不同的 Modelbinder 也可以解决问题。我使用 DataAnnotations 模型绑定器,并且在绑定到's时我不必生成.Index字段。List

于 2009-10-14T15:41:11.920 回答