列表中的MVC4绑定下拉列表(bug)

时间:2013-02-19 06:56:23

标签: asp.net-mvc razor binding html.dropdownlistfor

我在视图中有以下代码。 (index.cshtml)

绑定问题

  • 第一个下拉列表根据'ChildItem'编辑器模板选择正确的值。
  • 使用内联下拉列表的第二个示例不起作用我不想创建一个编辑器模板来显示下拉值。
  • 奇怪的是TextBoxFor会显示正确的值。这似乎只是下拉列表中的一个问题。

如何修复绑定以便第二次下拉工作?我调试了它。看来ViewData.Eval没有从_.Children[i].ChooseId中获取正确的值。

更新(错误)
这是MVC框架http://aspnet.codeplex.com/workitem/8311

中确认的错误(低优先级,如何?)
@using (Html.BeginForm())
{
    for (int i = 0; i < Model.Children.Count(); i++)
    {
       <p>A: @Html.EditorFor(_ => _.Children[i], "ChildItem")</p>
       <p>B: @Html.DropDownListFor(_ => _.Children[i].ChooseId, TestModel.PeopleSelect)</p>
    }
    <button type="submit">GO</button>
}

我尝试使用DropDownListFor(_ => Model.Children[i].ChooseId),结果相同。
使用TextBoxFor(_ => _.Children[i].ChooseId)显示正确的值 wierd?

此处参考的是ChildItem.cshtml

@using dropdown.Controllers
@using dropdown.Models
@model dropdown.Models.TestPerson
@Html.DropDownListFor(_ => _.ChooseId, TestModel.PeopleSelect)

看起来像这样:

A works, B does not.

2 个答案:

答案 0 :(得分:2)

我后来发现了这个:http://aspnet.codeplex.com/workitem/8311 这是一个确认的错误。

我找到的唯一解决方法就是这个。

标记所选项目

@Html.DropDownListFor(_ => _.Children[i].ChooseId, Mark(TestModel.PeopleSelect, Model.Children[i].ChooseId))

标记功能/扩展方法

@functions {
    private IEnumerable<SelectListItem> Mark(IEnumerable<SelectListItem> items, object Id)
    {
        foreach (var item in items)
            if (string.CompareOrdinal(item.Value, Convert.ToString(Id)) == 0)
                item.Selected = true;
        return items;
    }
}

答案 1 :(得分:0)

您可以将这些项目放到局部视图中并为您的子对象加载,或者...

您可以选择对子集合进行React.Component循环,并像这样使用它:

this.state

这假定已将foreach创建为foreach (var itm in Model.Children) { @Html.DropDownListFor(modelItem => itm.ChooseId, new SelectList( (IEnumerable<SelectListItem>)TestModel.PeopleSelect, "Value", "Text", itm.ChooseId), htmlAttributes: new { @class = "form-control" } ) } TestModel.PeopleSelect。我正确回答以下相关问题的代码是:ASP.NET MVC4 Model's Child Collection Drop Down List not binding properly

在子集合上执行SelectListItem[]循环会给我错误:

不能将带有[]的索引应用于类型为'ICollection '的表达式

所以我不建议这样做。