MVC - 在下拉列表中更改默认文本

时间:2015-06-11 17:32:38

标签: asp.net-mvc razor enums html.dropdownlistfor

我有一个包含enum的视图模型:

public class PasswordChangerIndexViewModel
{
    public enum DatabaseTypes
    {
        Main = 10,
        Florida = 20,
        Illinois = 30,
        Missouri = 40,
        NewHampshire = 50,
        NewJersey = 60,
        Oklahome = 70
    };

    [DisplayName("Database")]
    public DatabaseTypes DatabaseType { get; set; }

}

在我看来,我使用EnumDropDownListFor创建了一个下拉列表:

<div class="row">
    <div class="col-md-1">
        <div class="form-group">
            @Html.EnumDropDownListFor(z => z.DatabaseType, "** Select a Database **");
        </div>
    </div>
</div>

它正在运作,但我想知道是否有办法改变文字。我想要New Hampshire而不是NewHampshireNew Jersey而不是NewJersey来呈现print。是否有一种DisplayName attribute或我可以应用于我的视图模型来修复此问题?

2 个答案:

答案 0 :(得分:2)

在枚举成员上使用DisplayAttribute

public enum DatabaseTypes
{
  Main = 10,
  Florida = 20,
  Illinois = 30,
  Missouri = 40,
  [Display(Name = "New Hampshire")]
  NewHampshire = 50,
  [Display(Name = "New Jersey")]
  NewJersey = 60,
  Oklahome = 70
};

一般情况下,您应该支持使用[Display]代替[DisplayName],因为它支持本地化。

答案 1 :(得分:1)

您可以为Enum DropdownList制作自己的模板。这是我使用的一个使用扩展方法从属性中获取值而不仅仅是枚举的名称:

将其作为EnumDropdown.cshtml

放在Views / Shared / EditorTemplates目录中
@model Enum

@{
    var sort = (bool?)ViewData["sort"] ?? false;
    var enumValues = new List<object>();
    foreach (var val in Enum.GetValues(Model.GetType()))
    {
        enumValues.Add(val);
    }
}

@Html.DropDownListFor(m => m,
    enumValues
    .Select(m =>
    {
        string enumVal = Enum.GetName(Model.GetType(), m);
        var display = m.GetDescription() ?? enumVal;
        return new SelectListItem()
        {
            Selected = (Model.ToString() == enumVal),
            Text = display,
            Value = enumVal
        };
    })
    .OrderBy(x => sort ? x.Text : null)
    ,new { @class = "form-control" })

以下是GetDescription()的代码:

    public static string GetDescription(this object enumerationValue)
    {
        Type type = enumerationValue.GetType();
        if (!type.IsEnum)
            throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");

        //Tries to find a DescriptionAttribute for a potential friendly name
        //for the enum
        MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
        if (memberInfo != null && memberInfo.Length > 0)
        {
            object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attrs != null && attrs.Length > 0)
            {
                //Pull out the description value
                return ((DescriptionAttribute)attrs[0]).Description;
            }
        }
        //If we have no description attribute, just return the ToString of the enum
        return enumerationValue.ToString();

    }

下面的示例用法。型号:

public enum MyEnum 
{
    [Description("The First Option1")]
    Option1,
    Option2
}
public class MyModel
{
    [UIHint("EnumDropdown")] //matches EnumDropdown.cshtml
    public MyEnum TheEnum { get; set; }
}

查看

@model MyModel
@Html.EditorFor(x => x.TheEnum)

将使用选项“The First Option”和“Option2”

创建一个下拉列表