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

MVC - Changing default text in dropdown

我有一个包含 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。有没有一种 DisplayName attribute 或者我可以应用到我的视图模型来解决这个问题的东西?

您可以为枚举下拉列表创建自己的模板。这是我使用的一个,它使用扩展方法从属性中获取值,而不仅仅是枚举的名称:

将其作为 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"

的下拉菜单

对您的枚举成员使用 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],因为它支持本地化。