所以我有一个包含项目列表的表单,每个项目都有一个选择列表。我的代码是这样的(删除了多余的项目):
@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" })
但它似乎并不想像在其他情况下那样从表达式中获取它。
答案 0 :(得分:1)
这里的问题是所有DropDown帮助器查找defaultValue的方式(这总是一个痛点)。
当他们找到ModelState
时(即,从POST返回视图时),他们将使用它,并且您的案例将正常工作,因为ModelState
确实有一个名为{的词典条目{1}}。
但是,当没有InputSlots[0].VariableId
时,它们将回退到ModelState
及其ViewData
方法。
该方法将查看Eval()
字典键的视图数据 - 或InputSlots[0].VariableId
上具有该名称的属性(通过Model
)。
它还会尝试TypeDescriptor.GetProperties()
- 即找到具有该名称的属性或带有该键的字典条目 - 然后查找InputSlots[0]
子属性。
当然,找不到VariableId
和InputSlots[0].VariableId
,因为其名称中没有包含InputSlots[0]
的属性或密钥 - 而[0]
不会做任何分析索引器的工作 - 只需将字符串分成点(Eval()
)即可。
简而言之,如果lambda表达式(或字符串文字)中的索引器传递给帮助程序,那么帮助程序(因为它们在MVC 4中工作)将无法自动找到默认值。我想不出比自己更好的方法,就像你在更新问题时那样。