Asp.net mvc 具有可变长度列表的EditorFor-删除项目后显示错误数据
我正在尝试创建一个表单,客户可以使用该表单为不同数量的模型下订单。它类似于中的示例,但我没有使用任何javascript—我只是在表单中有多个提交 一切正常,我可以添加任意数量的项目,但当我删除一个项目时,列表中的最后一个项目总是被删除。下面是一些代码: 来自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
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
soModel.Input.Models
只是ModelCreateModel
的列表
现在如果我:
delete#0
submit以删除AAA型号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);
}