【问题标题】:MVC - Changing default text in dropdownMVC - 更改下拉菜单中的默认文本
【发布时间】:2015-08-27 13:12:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我不知道!那很好。在我的回答中,我们使用了一些其他规则和功能,因此能够完全控制它是件好事。
    【解决方案2】:

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

    把它放在 Views/Shared/EditorTemplates 目录中,作为EnumDropdown.cshtml

    @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)
    

    将创建一个带有选项“第一个选项”和“选项 2”的下拉列表

    【讨论】:

    • 这不太适合我。这感觉就像它只是一个更大的程序的一部分。
    • 什么“不太好用”?我可以帮你解决。我也会发布GetDescription() 的代码
    • 如果你能发帖GetDescription()enumType,那就太好了
    • 对于enumType,我将其设置为typeof(PasswordChangerIndexViewModel),但似乎不是这样。
    • 对,忘了不是Array&lt;T&gt;。我已经更新了我的答案,以展示另一种获取枚举值的方法。
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多