2

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

@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" })

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

4

1 回答 1

1

这里的问题是所有 DropDown 助手查找 defaultValue 的方式(这始终是一个痛点)。

当他们找到ModelState时(即,从 POST 返回视图时),他们将使用它,并且您的案例将正常工作,因为ModelState确实有一个名为InputSlots[0].VariableId.

但是,当没有ModelState时,它们会退回到ViewData它的Eval()方法。

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

它还将尝试InputSlots[0]-即查找具有该名称的属性或具有该键的字典条目-然后查找VariableId子属性。

当然,InputSlots[0].VariableIdInputSlots[0]不会找到,因为它的名称中没有包含属性或键[0]- 并且Eval()不做任何解析索引器的工作 - 它通过简单地在点 ( .) 处拆分字符串来工作。

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

于 2013-07-27T04:19:33.180 回答