【发布时间】: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 的列表
现在如果我:
使用此表单添加 3 个模型(名称为 AAA、BBB、CCC)
点击
delete#0提交删除模型AAA
因此,我将获得模型 AAA 和 BBB 的编辑器,但显示模型 BBB 和 CCC时间>。这对我来说太疯狂了!我已经用 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