Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 具有可变长度列表的EditorFor-删除项目后显示错误数据_Asp.net Mvc_Editorfor - Fatal编程技术网

Asp.net mvc 具有可变长度列表的EditorFor-删除项目后显示错误数据

Asp.net mvc 具有可变长度列表的EditorFor-删除项目后显示错误数据,asp.net-mvc,editorfor,Asp.net Mvc,Editorfor,我正在尝试创建一个表单,客户可以使用该表单为不同数量的模型下订单。它类似于中的示例,但我没有使用任何javascript—我只是在表单中有多个提交 一切正常,我可以添加任意数量的项目,但当我删除一个项目时,列表中的最后一个项目总是被删除。下面是一些代码: 来自Create.aspx的片段: <% for (int i = 0; i < Model.Input.Models.Count; i++ ){%> <%: Html.EditorFor(m => m.Inp

我正在尝试创建一个表单,客户可以使用该表单为不同数量的模型下订单。它类似于中的示例,但我没有使用任何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>
<%}%>
在我的
OrderCreateModel
中,我有一个
Input
类型的属性
OrderCreateModel.InputModel
so
Model.Input.Models
只是
ModelCreateModel
的列表

现在如果我:

  • 使用此表单添加3个型号(名称为AAA、BBB、CCC)

  • 单击a
    delete#0
    submit以删除AAA型号

  • 因此,我将获得AAA和BBB型号的编辑器,但显示BBB和CCC型号的编辑器。这对我来说太疯狂了!我已经和fiddler核对过了,这就是响应的真实情况——这不是我的浏览器的错。另外,在调试代码后,我100%确定在将BBB模型传递到
    View()
    之前,我正在从
    Input.Models
    中删除BBB模型

    有什么建议我如何解决这个问题

    注意:我不想为此使用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
    ,并将其放入
    视图数据中


    FillCreateModelWithMaps
    只是用数据填充
    viewModel.ExistingMaps

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

    将此添加到您的操作中:

    ViewData.ModelState.Clear()

    [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);
    }