我正在尝试创建一个表单,客户将使用该表单来订购可变数量的模型。它类似于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
只是一个ModelCreateModel
s的列表
现在如果我:
使用此表格添加 3 个模型(名称为AAA、BBB、CCC)
单击
delete#0
提交以删除模型AAA
结果,我将获得模型AAA和BBB的编辑器,但显示模型BBB和CCC。这对我来说太疯狂了!我已经用 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
数据。