gpt4 book ai didi

c# - DropDownListFor 不尊重 SelectList 的 Selected 属性

转载 作者:可可西里 更新时间:2023-11-01 08:55:13 25 4
gpt4 key购买 nike

我有以下代码行:

@Html.DropDownListFor(x => x.TimeOption, new SelectList(Model.TimeOptions, "Value", "Name", (int)Model.TimeOption))

下拉列表已正确构建,并且 Selected 确实正确,但 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>

但是,如果您查看随附的屏幕截图,您会发现它已被正确选择:

Watch list

这只影响 GET,不影响 POST。想法?

最佳答案

这往往会难倒很多人——显然 MVC 5 的路线图包括更直观的 DropDownList 助手。

当你这样做时:

@Html.DropDownListFor(x => x.TimeOption ...)

...HTML 帮助器将竭尽全力不会使用您设置为 Selected = true 的值在你的SelectList .它将:

  • 尝试从 ModelState 获取它- 它不会在 GET 请求中得到
  • 尝试从 ViewData 获取它- 它得到,因为你有一个 TimeOption您模型上的属性。

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

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

错了。因为它不会将您的属性( enum ?)转换为 int像你所做地。它会将其转换为字符串。对于 enum产生枚举的名称 - 例如PastMonth .如果TimeOption是你的自定义类,它将是 ToString() 的结果.

然后,当它找不到该字符串作为您的 <select> 之一时值(因为它们都是整数),它决定不选择任何东西。

简而言之:SelectListItem.Selected对助手没有影响。如果您的助手调用指定了一个名称(字面上或通过 lambda 表达式),助手将使用 ModelState 中的任何内容。或 ViewData使用该名称,并将其转换为字符串。

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

关于c# - DropDownListFor 不尊重 SelectList 的 Selected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17691742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com