Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 MVC4 Html.DropDownListFor在循环中未设置选定选项_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 4 MVC4 Html.DropDownListFor在循环中未设置选定选项

Asp.net mvc 4 MVC4 Html.DropDownListFor在循环中未设置选定选项,asp.net-mvc-4,Asp.net Mvc 4,所以我有一个表单,它包含一个项目列表,每个项目都有一个选择列表。我的代码是这样的(删除了无关项): 但它似乎不想像在其他情况下那样从表达式中获取它。这里的问题是所有下拉帮助程序查找defaultValue的方式(这始终是一个难点) 当他们找到ModelState时(即,当从帖子返回视图时),他们将使用它,您的案例将正常工作,因为ModelState确实有一个名为InputSlots[0]的字典条目。VariableId 但是,当没有ModelState时,它们将返回到ViewData及其Eval

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


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

这里的问题是所有下拉帮助程序查找defaultValue的方式(这始终是一个难点)

当他们找到
ModelState
时(即,当从帖子返回视图时),他们将使用它,您的案例将正常工作,因为
ModelState
确实有一个名为
InputSlots[0]的字典条目。VariableId

但是,当没有
ModelState
时,它们将返回到
ViewData
及其
Eval()方法

该方法将在视图数据中查找
InputSlots[0].VariableId
字典键或
模型上具有该名称的属性(通过
TypeDescriptor.GetProperties()

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

当然,
InputSlots[0].VariableId
InputSlots[0]
都找不到,因为没有一个属性或键在其名称中包含
[0]
,而且
Eval()
不做任何解析索引器的工作-它只需在点处拆分字符串(


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

请参阅例如,以及从中链接的五个问题中的任何一个(它们都是同一事物的变体)。这些链接确实提醒我,SelectList的构造函数中有一个参数用于设置所选项目,这确实有效,但是他们并没有真正解决为什么它不能从我的lambda那里得到它的问题。我的理解是DropDownListFor实际上应该忽略这个论点,除非它无法从表达式中理解。对,误读了这个问题。。。这里的问题是,所有帮助程序使用lambda的目的都是将其转换为字符串表示形式,它使用该表示形式在
ModelState
ViewData
中查找值。换句话说,到那时,它实际上不知道
i
有什么值,所以它找不到
Model.InputSlots[i]
的值。助手必须能够计算出i的值,因为它将i用作输入字段的名称。i、 e.生成的select元素的名称如下所示:
name=“InputSlots[0].VariableId”
是的,我觉得这有点胡说八道。我会添加一个更接近实际的答案,我完全忘记了MVC是开源的。查看代码后,您似乎是正确的。我本以为他们只是执行lambda表达式来获得默认值,但显然不是。
@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" })
}
 @Html.DropDownListFor(model => model.InputSlots[i].VariableId,
      new SelectList(Model.Variables, "VariableId", "Name", Model.InputSlots[i].VariableId),
      "--Select Variable--", 
      new { @class = "span8" })