绑定到同一模型属性的多个DropDownListFor生成相同的ID和名称

时间:2015-09-26 18:57:34

标签: c# asp.net asp.net-mvc html.dropdownlistfor

考虑以下模型:

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)

使用多种形式背后的想法是让我知道哪个项目已经改变。

我可以在回发中坚持整个模型,但无论如何都知道哪个值发生了变化?

0 个答案:

没有答案