【问题标题】:How to get SelectList to honor DisplayName annotation with enums?如何让 SelectList 使用枚举来尊重 DisplayName 注释?
【发布时间】:2012-11-21 18:28:41
【问题描述】:

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

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

这很好用。但是,我想显示与枚举中的每个值相关联的DisplayNameAttributeDisplayName 属性。

我搜索了 Stackoverflow,并看到了许多使用帮助程序、扩展等实现此目的的方法。是否可以在这样的单个语句中轻松告诉 SelectList 使用 DisplayNameAttribute

我在想这样的事情:

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

【问题讨论】:

  • 没有内置的方法可以做到这一点。正如您在其他帖子中看到的那样,您需要使用/编写帮助程序、扩展程序等。
  • 我不这么认为,但是你为什么不干脆写一个方法来接受一个枚举,提取 DisplayName 注释并返回一个 SelectList?

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


【解决方案1】:

我已经编写了一些代码,除了查找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,而是创建了看起来有点像这样的编辑器和显示模板(称为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; }
}

有一些边缘情况需要注意,例如处理 null 值、可为 null 的类型以及向下拉列表添加默认条目,但这应该可以让您入门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2014-03-04
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多