1

我在我的 ViewModels 中使用枚举来填充DropDownListFor这样的:

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

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

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

我在想类似的事情:

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

1 回答 1

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在我的视图中调用,而是创建了看起来有点像这样的编辑器和显示模板(称为 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 的类型以及向下拉列表添加默认条目,但这应该可以让您入门。

于 2013-05-11T14:41:41.520 回答