C#MVC 5 Razor:下拉列表显示小写值而不是大写

时间:2017-11-21 09:50:04

标签: c# drop-down-menu asp.net-mvc-5

我有一个看起来像这样的枚举(描述被审查但值很准确):

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" (小写):

enter image description here

这是一个问题,因为我必须显示" W"而不是" w",因为这是存储在数据库中的值。类似地,如果" w"存储,然后我必须显示" w"而不是" W"。我不明白为什么" W"转换为" w"在这种情况下,就像我调试程序时一样,我可以清楚地看到传递给视图的值是" W"。

有人能告诉我在哪里犯了错误吗?请注意,我不能简单地给出" w"另一个价值 - 我在这个问题上没有选择。

1 个答案:

答案 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方法,则需要编写自己的扩展方法(将源代码复制到您自己的项目中,删除您不需要的各种重载,并且进行修改以使其不区分大小写)