我有一个看起来像这样的枚举(描述被审查但值很准确):
db.setProfilingLevel(1, 10000)
我必须在视图中显示此下拉列表,该视图从数据库中获取其数据。对于这个问题,请注意值" W" (大写)是我想要显示的那个。
DropDownList代码如下所示:
public enum internalTypes
{
[Description("Description 1 (W)")]
W,
[Description("Description 2 (w)")]
w,
[Description("Description 3 (A)")]
A,
[Description("Description 4 (C)")]
C,
[Description("Description 5 (K)")]
K,
[Description("Description 6 (X)")]
X
}
Model.listOfTypes:
@Html.DropDownListFor(model => model.Internal_List[i].ValueToDisplay, new SelectList(Model.listOfTypes, "Value", "Text", Model.Internal_List[i].ValueToDisplay), "", new { @class = "full", style = "width:275px" })
其中Internal_List [i] .ValueToDisplay确实正确发送 - 也就是说,它正确发送" W" (大写)。但是,视图显示" w" (小写):
这是一个问题,因为我必须显示" W"而不是" w",因为这是存储在数据库中的值。类似地,如果" w"存储,然后我必须显示" w"而不是" W"。我不明白为什么" W"转换为" w"在这种情况下,就像我调试程序时一样,我可以清楚地看到传递给视图的值是" W"。
有人能告诉我在哪里犯了错误吗?请注意,我不能简单地给出" w"另一个价值 - 我在这个问题上没有选择。
答案 0 :(得分:1)
您无法使用DropDownListFor()
(或EnumDropDownListFor()
等方法)选择正确的选项。在内部,方法会生成一个新的IEnumerable<SelectListItem>
,以便根据绑定属性的值设置Selected
属性。
具体而言,private static IEnumerable<SelectListItem> GetSelectListWithDefaultValue()
方法(您可以查看source code here)使用StringComparer.OrdinalIgnoreCase
比较值,因此值为w
(小写)和W
(大写)两者都匹配,两个选项都将使用selected="selected"
属性设置。
但是因为你生成一个<select>
(没有multiple
属性),这将是无效的(只能选择一个选项),所以浏览器只选择最后一个呈现的selected="selected"
如果您无法更改enum
的值,并希望使用HtmlHelper
方法,则需要编写自己的扩展方法(将源代码复制到您自己的项目中,删除您不需要的各种重载,并且进行修改以使其不区分大小写)