DropDownList不尊重SelectList的Selected属性

Sam*_*Sam 10 c# asp.net-mvc

我有以下代码行:

@Html.DropDownListFor(x => x.TimeOption, new SelectList(Model.TimeOptions, "Value", "Name", (int)Model.TimeOption))
Run Code Online (Sandbox Code Playgroud)

正确构建了下拉列表,并且选择确实是正确的但MVC不会在选择了正确的项目的情况下绘制下拉列表.标记不会在选项上输出选定的属性.

输出呈现为:

<option value="0">Past Day</option>
<option value="1">Past Week</option>
<option value="2">Past Month</option>
<option value="3">Past Year</option>
<option value="4">Start of Time</option>
Run Code Online (Sandbox Code Playgroud)

然而,如果您查看附加的屏幕截图,您可以看到它已正确选择:

观察清单

这仅影响GET,而不影响POST.想法?

Jim*_*iTh 22

这往往会让人们陷入困境 - 显然MVC 5的路线图包含更直观的DropDownList助手.

当你这样做时:

@Html.DropDownListFor(x => x.TimeOption ...)
Run Code Online (Sandbox Code Playgroud)

...的HTML帮助将尽其一切力量使用你的值设置为Selected = true你的SelectList.它会:

  • 试着从中得到它ModelState- 它不会得到GET请求
  • 尝试从得到它ViewData-它得到的,因为你有TimeOption你的模型属性.

只有当这两个尝试都失败时,它才会屈服,并使用你要求它使用的东西.

因此,在您的情况下,它将使用TimeOption模型上的当前值作为选定值.哪个应该没问题,因为这就是你在SelectList反正中所要求的(int)Model.TimeOption,对吧?

错误.因为它不会像你一样投射你的财产(enum?)int.它会将其转换为字符串.对于一个enum产生枚举的名称 - 例如PastMonth.如果TimeOption是你的自定义类,那将是结果ToString().

然后,当它没有找到该字符串作为您的一个<select>值(因为它们都是整数)时,它决定不进行任何选择.

简而言之:SelectListItem.Selected对帮助者没有影响.如果你的助手调用指定一个名称(无论是从字面上或通过lambda表达式),助手将使用任何ModelStateViewData使用该名称,并将其转换为字符串.

在大多数情况下,这会发生在枚举中.解决它的最简单方法是使用枚举的名称而不是其int表示作为的值SelectListItem.

  • 看起来要么是一个疏忽,要么是一个奇怪的设计决定。我将整数枚举值分配给 ViewData,并且它有效。感谢您的帮助。 (2认同)