我有一个看起来像这样的枚举(描述被审查但值是准确的):
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
}
我必须在从数据库中获取数据的视图中显示此下拉列表。对于这个问题,请注意值“W”(大写)是我要显示的值。
DropDownList 代码如下所示:
@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" })
Model.listOfTypes:
IEnumerable<ExtensionMethods.internalTypes> internalTypes= Enum.GetValues(typeof(ExtensionMethods.internalTypes)).Cast<ExtensionMethods.internalTypes>();
evm.listOfTypes = from inter in internalTypes
select new SelectListItem
{
Text = ExtensionMethods.GetDescription(inter),
Value = inter.ToString()
};
其中 Internal_List[i].ValueToDisplay 确实被正确发送 - 也就是说,它正确发送“W”(大写)。但是,视图显示“w”(小写):
这是一个问题,因为我必须显示“W”,而不是“w”,因为这是存储在数据库中的值。同样,如果存储了“w”,那么我必须显示“w”,而不是“W”。我不明白为什么在这种情况下将“W”转换为“w”,因为在调试程序时,我可以清楚地看到传递给视图的值是“W”。
谁能告诉我我可能在哪里犯了错误?请注意,我不能简单地给 "w" 另一个值——我在这件事上别无选择。
您不能使用DropDownListFor()
(或EnumDropDownListFor()
等方法)选择正确的选项。这些方法IEnumerable<SelectListItem>
在内部生成一个新的,以便Selected
根据绑定到的属性的值设置属性。
具体来说,该private static IEnumerable<SelectListItem> GetSelectListWithDefaultValue()
方法(您可以在此处查看源代码)比较使用StringComparer.OrdinalIgnoreCase
的值,因此w
(小写)和W
(大写)的值都匹配并且两个选项都将使用该selected="selected"
属性设置。
但是因为你生成了一个<select>
(没有multiple
属性),那将是无效的(只能选择一个选项),所以浏览器只选择最后一个渲染的selected="selected"
如果你不能改变你的值enum
,并想使用一个HtmlHelper
方法,你需要编写你自己的扩展方法(将源代码复制到你自己的项目中,删除你不需要的各种重载,d并进行修改它不区分大小写)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句