如何让SelectList使用枚举来表示DisplayName注释?

时间:2012-11-21 18:28:41

标签: asp.net-mvc enums data-annotations

我在我的ViewModel中使用枚举来填充DropDownListFor,如下所示:

@Html.DropDownListFor(model => model.SelectedDropDownValue, 
       new SelectList(Enum.GetValues(typeof(SearchOptions)), SearchOptions.SSN))

这很有效。但是,我想显示与枚举中的每个值相关联的DisplayName的{​​{1}}属性。

我已经搜索了Stackoverflow,并看到了使用帮助器,扩展等执行此操作的多种方法。在这样的单个语句中,是否可以轻松告诉DisplayNameAttribute使用SelectList }?

我在想:

DisplayNameAttribute

1 个答案:

答案 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; }
}

需要注意一些边缘情况,例如处理空值,可空类型以及向下拉列表中添加默认条目,但这应该让您可以开始使用。