MVC4 Html.DropDownListFor在循环中没有设置选定的选项

时间:2013-07-25 23:54:51

标签: asp.net-mvc-4

所以我有一个包含项目列表的表单,每个项目都有一个选择列表。我的代码是这样的(删除了多余的项目):

@for( var i = 0; i < Model.InputSlots.Count; i++)
{
 @Html.DropDownListFor(model => model.InputSlots[i].VariableId,
      new SelectList(Model.Variables, "VariableId", "Name"),
      "--Select Variable--", 
      new { @class = "span8" })
}

下拉列表显示正确,如果我选择其中一个项目并发布表单,则选择正确发布,但是当我将VariableId设置为有效选项加载页面时,它不会显示所选选项,但显示默认的“--Select Variable--”。

我在我的代码中的许多其他地方使用DropDownListFor,它按预期工作,只是不在这种情况下。我能说的唯一区别是它引用了一个数组项的属性。

我在视图中设置了一个断点,以验证Model.InputSlots [i] .VariableId是否设置为有效选项(2),我还查看了生成的HTML,以确保有一个选项值为2且两者似乎都是正确的,但选项元素上没有“选中”值为2.

这是一种已知的行为,还是我只是在某些我没注意到的地方做错了什么?

更新

在SelectList构造函数中设置所选项目确实有效,即:

 @Html.DropDownListFor(model => model.InputSlots[i].VariableId,
      new SelectList(Model.Variables, "VariableId", "Name", Model.InputSlots[i].VariableId),
      "--Select Variable--", 
      new { @class = "span8" })

但它似乎并不想像在其他情况下那样从表达式中获取它。

1 个答案:

答案 0 :(得分:1)

这里的问题是所有DropDown帮助器查找defaultValue的方式(这总是一个痛点)。

当他们找到ModelState时(即,从POST返回视图时),他们将使用它,并且您的案例将正常工作,因为ModelState确实有一个名为{的词典条目{1}}。

但是,当没有InputSlots[0].VariableId时,它们将回退到ModelState及其ViewData方法。

该方法将查看Eval()字典键的视图数据 - 或InputSlots[0].VariableId上具有该名称的属性(通过Model)。

它还会尝试TypeDescriptor.GetProperties() - 即找到具有该名称的属性或带有该键的字典条目 - 然后查找InputSlots[0]子属性。

当然,找不到VariableIdInputSlots[0].VariableId,因为其名称中没有包含InputSlots[0]的属性或密钥 - 而[0]不会做任何分析索引器的工作 - 只需将字符串分成点(Eval())即可。

简而言之,如果lambda表达式(或字符串文字)中的索引器传递给帮助程序,那么帮助程序(因为它们在MVC 4中工作)将无法自动找到默认值。我想不出比自己更好的方法,就像你在更新问题时那样。