4

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

绑定问题

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

如何修复绑定以便第二个下拉菜单起作用?我调试了它。看起来 ViewData.Eval 没有从_.Children[i].ChooseId.

更新(bug)
这是MVC框架http://aspnet.codeplex.com/workitem/8311中确认的bug(低优先级,如何?)

@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),同样的结果。
usingTextBoxFor(_ => _.Children[i].ChooseId)显示正确的值,奇怪吗?

这里供参考ChildItem.cshtml

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

它看起来像这样:

A有效,B无效。

4

2 回答 2

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;
    }
}
于 2013-02-19T11:39:27.403 回答
0

您可以将项目放入部分视图并为您的子对象加载它,或者......

您可以选择对子集合进行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已创建为 aSelectListItem[]IEnumerable<SelectListItem>。正确执行此操作的代码在我对相关问题的回答中: ASP.NET MVC4 Model's Child Collection Drop Down List not binding proper

对子集合执行for循环给了我错误:

无法将带有 [] 的索引应用于“ICollection<Children>”类型的表达式

所以我不建议这样做。

于 2018-10-11T02:15:08.513 回答