如何在MVC视图中的DropDownList中显示来自Enum的用户友好名称?

时间:2015-05-29 08:57:36

标签: asp.net-mvc asp.net-mvc-4 drop-down-menu enums

目前在我的mvc View中显示DropDownList中的枚举值,但名称" Brittish_Airways"不看起来用户友好,试图取代" Brittish Airways"在" Brittish_Airways"在我看来,如何做到这一点?

在枚举列表

中显示特殊字符/符号空格

我的枚举: -

 public enum EventType
 {
        Other = 0,
        Birth = 1,
        Marriage = 2,
        Death = 3,
       Brittish_Airways=4
}

我的参考代码: - >

  <li>
    @Html.DropDownListFor(model => model.EventTypeText,
                                   Enum.GetNames(typeof(ABC.Web.EventType))
                                  .Select(e => 
                                           new SelectListItem { Text = e 
                                         }),
                                   new { @class = "ddlEventType ddl" })
 </li>

2 个答案:

答案 0 :(得分:2)

您必须首先为Enum创建属性,该属性将在Enum字段上用于设置用户友好的显示名称:

public class EnumDisplayNameAttribute : Attribute
{
  private string _displayName;
  public string DisplayName
  {
      get { return _displayName; }
      set { _displayName = value; }
  }
}

然后你必须在你的枚举字段上装饰属性,如下所示:

public enum EventType
{
        [EnumDisplayName(DisplayName="Some User Friendly Name")]
        Other = 0,
        [EnumDisplayName(DisplayName="Some User Friendly Name")]
        Birth = 1,
        [EnumDisplayName(DisplayName="Some User Friendly Name")]
        Marriage = 2,
        [EnumDisplayName(DisplayName="Some User Friendly Name")]
        Death = 3,
        [EnumDisplayName(DisplayName="Some User Friendly Name")]
        Brittish_Airways=4
}

现在将Enum的以下扩展方法添加到现有的Extension Methods类中,或者创建一个名为EnumExtensions的新方法:

public static class ExtensionMethods
{
    public static System.Web.Mvc.SelectList ToSelectList<TEnum>(this TEnum obj)
        where TEnum : struct, IComparable, IFormattable, IConvertible // correct one
    {

    return new SelectList(Enum.GetValues(typeof(TEnum)).OfType<Enum>()
        .Select(x =>
            new SelectListItem
            {
                Text = x.DisplayName(),
                Value = (Convert.ToInt32(x)).ToString()
            }), "Value", "Text");

    }


   public static string DisplayName(this Enum value)
   {
       FieldInfo field = value.GetType().GetField(value.ToString());

       EnumDisplayNameAttribute attribute
               = Attribute.GetCustomAttribute(field, typeof(EnumDisplayNameAttribute))
                   as EnumDisplayNameAttribute;

       return attribute == null ? value.ToString() : attribute.DisplayName;
   }
}

现在在您的视图中使用扩展方法将Enum字段作为SelectList返回,其用户友好名称为选项文本:

@using YourNamespace.ExtensionMethods;

 @Html.DropDownListFor(model => model.EventTypeText,
                                EventType.Other.ToSelectList()), 
                                new { @class = "ddlEventType ddl" })

您还可以查看my article (Binding Enum with DropdownList in asp.net mvc )

答案 1 :(得分:0)

从MVC 5.1及更高版本开始,他们添加了此新帮助器。您只需要一个枚举

public enum Month
    {
        [Display(Name = "January")]
        jan,
        [Display(Name = "February")]
        feb
    }

在枚举中[Description(“ ...”)也可用,但是在将其与EnumDropDownListFor结合使用之前,请先进行读取/研究(我仅使用Display(Name))。

然后

您可以通过编写以下内容来创建显示名称的EnumDropDownlist:

@Html.EnumDropDownListFor(model => model.Month, null, new { @id = "ddlMonth", @class = "form-control", @style = "width:200px;" })
shareeditflag