1

我正在尝试创建一个表单,客户将使用该表单来订购可变数量的模型。它类似于Steve Sanderson 博客中的示例,但我没有使用任何 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只是一个ModelCreateModels的列表

现在如果我:

  1. 使用此表格添加 3 个模型(名称为AAABBBCCC

  2. 单击delete#0提交以删除模型AAA

结果,我将获得模型AAABBB的编辑器,但显示模型BBBCCC。这对我来说太疯狂了!我已经用 fiddler 进行了检查,这确实是响应的样子——这不是我的浏览器的错。此外,在调试完我的代码后,我 100% 确定在将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数据。

4

2 回答 2

2

将此添加到您的操作中:

ViewData.ModelState.Clear();

于 2011-05-18T16:18:37.697 回答
0

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

于 2011-05-18T16:11:53.110 回答