考虑以下模型:
public class MyViewModel
{
public List<MyViewModelGroup> Groups { get; set; }
}
public class MyViewModelGroup
{
public List<MyViewModelGroupItem> Items { get; set; }
}
public class MyViewModelGroupItem
{
public IEnumerable<SelectListItem> QuantityOptions { get; set; }
public string Quantity { get; set; }
public string ID { get; set; }
}
我需要在单个网页上显示多个表单,每个表单都包含MyViewModelGroupItem-&gt; Quantity属性的下拉列表。
为了做到这一点,我有一个视图,其中包含一个循环来遍历MyViewModel-&gt; Groups关系,使用一个foreach循环来控制@ Html.Partial(“Groups”,group)和一个遍历MyViewModelGroup的视图 - &gt;使用@ Html.EditorFor(m =&gt; Model.Items)的项目关系。注意:我相信MVC不能使用多个嵌套的EditorFor,因此使用Partial。 这是对MVC 4的不恰当的假设
所有这些都可以,并且EditorFor包含显示表单和列表的代码:
@model WebApplication1.Models.MyViewModelGroupItem
@using (Html.BeginForm("MyView", "My", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
<div class="item">
<div>@Html.DropDownListFor(m => m.Quantity, Model.QuantityOptions, new { onchange = "this.form.submit();" })</div>
</div>
}
问题是,在回发后,所有下拉菜单都设置为新用户选择的值,因为它们都具有相同的名称:
<select id="Items_0__Quantity" name="Items[0].Quantity"...>
此外,正确回发到控制器的模型在“数量”中设置了用户值,但ID为空,因此我无法确定哪个项目已设置?如果我尝试使用ID数据添加隐藏字段,它也始终返回null。
更新 我已经将代码更改为使用嵌套的EditorFor,现在它正确地命名了项目:
<select id="Groups_0__Items_0__Quantity" name="Groups[0].Items[0].Quantity"...>
<select id="Groups_1__Items_0__Quantity" name="Groups[1].Items[0].Quantity"...>
我还将所有内容移动到单个表单,并且回发接收整个对象模型。 ID仍为空,因此我添加了一个隐藏字段,现在ID已设置到模型中OK:
@Html.Hidden("ID", Model.ID)
使用多种形式背后的想法是让我知道哪个项目已经改变。
我可以在回发中坚持整个模型,但无论如何都知道哪个值发生了变化?