带有可变长度列表的EditorFor - 删除项目后显示错误数据

时间:2010-08-25 15:40:25

标签: asp.net-mvc editorfor

我正在尝试创建一个表单,客户可以使用该表单为可变数量的模型下订单。它类似于Steve Sanderson's blog中的示例,但我没有使用任何javascript - 我的表单中只有多个提交。

一切正常,我可以添加任意数量的项目,但是当我删除一个项目时,列表中的最后一个项目将被删除。这是一些代码:

来自Create.aspx的片段:

<% for (int i = 0; i < Model.Input.Models.Count; i++ ){%>
  <%: Html.EditorFor(m => m.Input.Models[i])%>
  <p><input type="submit" name="deleteModel#<%:i%>" value="Delete" /></p>
<%}%>

来自ModelCreateModel.ascx EditorTemplate的有趣片段:

<div class="editor-field">
    <%: Html.EditorFor(model => model.Name) %>
    <%: Html.DisplayFor(model => model.Name) %>
</div>

在我的OrderCreateModel我有Input类型的OrderCreateModel.InputModel属性,因此Model.Input.Models只是ModelCreateModel的列表

现在,如果我:

  1. 使用此表单添加3个模型(名称​​ AAA BBB CCC

  2. 点击delete#0提交以移除模型 AAA

  3. 因此,我将获得模型 AAA BBB 的编辑器,但显示模型 BBB CCC 。这对我来说太疯狂了!我用fiddler检查了它,这真的是响应的样子 - 这不是我浏览器的错。此外,在调试我的代码之后,我100%确定我将{em> BBB 模型从Input.Models移除,然后再将其传递给View()

    有任何建议我该如何解决这个问题?

    注意:我不想为此使用javascript。它将在稍后添加,以提供更好的用户体验,但网站也必须在禁用javascript的情况下正常工作。

    修改

    控制器代码:

    [HttpPost]
    [ActionName("Create")]
    [MultipleSubmits(InputName = "deleteModel", Argument = "deleteModelNr")]
    [Authorize(Roles = RoleHelper.Accountant + "," + RoleHelper.Admin)]
    public ActionResult CreateDeleteModel(OrderCreateModel.InputModel input)
    {
        var viewModel = new OrderCreateModel {Input = input};
        FillCreateModelWithMaps(viewModel, input.ClientId);
    
        var deleteModelNr = (int) ViewData["deleteModelNr"];
    
        if (input.Models.Count > deleteModelNr)
            input.Models.RemoveAt(deleteModelNr);
    
        return View(viewModel);
    }
    

    MutlipleSubmitsAttribute继承自ActionNameSelectorAttribute,此处从提交名称中提取deleteModelNr并将其放入ViewData

    FillCreateModelWithMaps只需填充viewModel.ExistingMaps数据。

2 个答案:

答案 0 :(得分:2)

将此添加到您的操作中:

ViewData.ModelState.Clear();

答案 1 :(得分:0)

EditorFor()和其他一些辅助方法使用ViewData.ModelState而不是模型本身。因此,似乎并未真正支持模型的更改。在我看来,这看起来像是MVC中的一个主要错误。