【问题标题】:EditorFor with a variable length list - wrong data is displayed after deleting an item具有可变长度列表的 EditorFor - 删除项目后显示错误数据
【发布时间】:2010-08-25 15:40:24
【问题描述】:

我正在尝试创建一个表单,客户将使用该表单来订购数量不定的模型。它类似于 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.ascxEditorTemplate 的有趣片段:

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

在我的OrderCreateModel 中,我有一个OrderCreateModel.InputModel 类型的属性Input,所以Model.Input.Models 只是ModelCreateModels 的列表

现在如果我:

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

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

因此,我将获得模型 AAABBB 的编辑器,但显示模型 BBBCCC时间>。这对我来说太疯狂了!我已经用 fiddler 进行了检查,这确实是响应的样子——这不是我的浏览器的错。此外,在调试完我的代码后,我 100% 确定我正在从 Input.Models 中删除 BBB 模型,然后再将其传递给 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

【问题讨论】:

    标签: asp.net-mvc editorfor


    【解决方案1】:

    将此添加到您的操作中:

    ViewData.ModelState.Clear();

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 2021-09-25
        相关资源
        最近更新 更多