我正在尝试创建一个表单,客户可以使用该表单为可变数量的模型下订单。它类似于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.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
的列表
现在,如果我:
使用此表单添加3个模型(名称 AAA , BBB , CCC )
点击delete#0
提交以移除模型 AAA
因此,我将获得模型 AAA 和 BBB 的编辑器,但显示模型 BBB 和 CCC 。这对我来说太疯狂了!我用fiddler检查了它,这真的是响应的样子 - 这不是我浏览器的错。此外,在调试我的代码之后,我100%确定我将{em> 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
数据。
答案 0 :(得分:2)
将此添加到您的操作中:
ViewData.ModelState.Clear();
答案 1 :(得分:0)
EditorFor()
和其他一些辅助方法使用ViewData.ModelState
而不是模型本身。因此,似乎并未真正支持模型的更改。在我看来,这看起来像是MVC中的一个主要错误。