我在我的ViewModel中使用枚举来填充DropDownListFor
,如下所示:
@Html.DropDownListFor(model => model.SelectedDropDownValue,
new SelectList(Enum.GetValues(typeof(SearchOptions)), SearchOptions.SSN))
这很有效。但是,我想显示与枚举中的每个值相关联的DisplayName
的{{1}}属性。
我已经搜索了Stackoverflow,并看到了使用帮助器,扩展等执行此操作的多种方法。在这样的单个语句中,是否可以轻松告诉DisplayNameAttribute
使用SelectList
}?
我在想:
DisplayNameAttribute
答案 0 :(得分:0)
我写了一些代码来做同样的事情,除了它寻找DescriptionAttribute
。
根据您的情况修改它看起来像这样:
public static string GetDescription(this Enum value)
{
if (value == null)
throw new ArgumentNullException("value");
var attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(DisplayNameAttribute), false)
.Cast<DisplayNameAttribute>()
.FirstOrDefault();
return attribute == null ? value.ToString() : attribute.DisplayName;
}
我没有创建一个选择列表并在我的视图中调用@Html.DropDownList
,而是创建了一个看起来有点像这样的编辑器和显示模板(Called Enum.cshtml):
var values = Enum.GetValues(enumType)
.Cast<Enum>()
.Select(v => new SelectListItem
{
Selected = v.Equals(Model),
Text = v.GetDescription(),
Value = v.ToString(),
});
Html.DropDownList("", values)
然后我使用UIHint属性装饰我的ViewModel中的任何枚举属性,任何枚举属性都会自动使用上面的代码。
public class MyViewModel
{
[UIHint("Enum")]
public MyEnumType MyProperty { get; set; }
}
需要注意一些边缘情况,例如处理空值,可空类型以及向下拉列表中添加默认条目,但这应该让您可以开始使用。