使用ASP.NET MVC3中的Display标记填充DropDownListFor

时间:2013-11-27 19:15:00

标签: asp.net-mvc asp.net-mvc-3 enums helper html.dropdownlistfor

我正在尝试为我的ASP.NET MVC3网站编写一个帮助程序,该帮助程序将能够返回包含Enum的所有SelectList属性标记的新Description

例如,使用以下枚举:

public enum Test
{
    [Display(Name = "Membre 1")]
    Member1,

    [Display(Name = "Membre 2")]
    Member2
}

我希望能够使用以下内容填充DropDownListFor

@Html.DropDownListFor(m => m.MyTest, MyHelper(Test))

MyTestTest变量)。

我希望我的DropDownList包含:     

  • Membre 1
  •     
  • Membre 2
  • 我曾经使用过这个工作助手:

    public static string GetEnumDescription(this Enum value)
    {
        Type enumType = value.GetType();
        var enumValue = Enum.GetName(enumType, value);
        MemberInfo member = enumType.GetMember(enumValue)[0];
    
        var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
        var outString = ((DisplayAttribute)attrs[0]).Name;
    
        if (((DisplayAttribute)attrs[0]).ResourceType != null)
        {
            outString = ((DisplayAttribute)attrs[0]).GetName();
        }
    
        return outString;
    }
    

    ...但我无法在SelectList

    中使用它

    如何修改此项以直接将其“合并”到我的@Html.DropDownListFor帮助程序中?

    我在互联网上看到了一些帮助,特别是herehere,但没有人适合我。有没有人能够共享一个简短优雅帮助器,它会返回枚举成员的所有Display属性,以便将它们放入{{ 1}}?

    2 个答案:

    答案 0 :(得分:1)

    为了实现Enum类型数据,我认为最简单的方法是使用自定义Enum帮助程序和模板。以下是我在项目中实现它们的方法。

    1)创建Enum Helper

    public static class EnumHelper
        {
            public static IEnumerable<SelectListItem> GetItems(this Type enumType, int? selectedValue)
            {
                if (!typeof (Enum).IsAssignableFrom(enumType))
                {
                    throw new ArgumentException("Type must be an enum");
                }
                string[] names = Enum.GetNames(enumType);
                IEnumerable<int> values = Enum.GetValues(enumType).Cast<int>();
    
                IEnumerable<SelectListItem> items = names.Zip(values, (name, value) =>
                    new SelectListItem
                    {
                        Text = GetName(enumType, name),
                        Value = value.ToString(),
                        Selected = value == selectedValue
                    }
                    );
                return items;
            }
            // Get Display Name
            private static string GetName(Type enumType, string name)
            {
                string result = name;
                DisplayAttribute attribute = enumType.GetField(name)
                    .GetCustomAttributes(false)
                    .OfType<DisplayAttribute>()
                    .FirstOrDefault();
                if (attribute != null)
                {
                    result = attribute.GetName();
                }
                return result;
            }
    
            public static string GetItemName(this Type enumType, int selectedValue)
            {
                if (!typeof (Enum).IsAssignableFrom(enumType))
                {
                    throw new ArgumentException("Type must be an enum");
                }
                var itemName = GetName(enumType, Enum.GetNames(enumType)[selectedValue]);
                return itemName;
            }
        }
    

    2)在共享文件夹中创建文件夹调用“DisplayTemplates”。

    3)在“DisplayTemmplates”中创建视图。视图如下所示:

    @using Demo.Web.Helper
    @{
        var itemName = typeof(Test).GetItemName((int)Model);
    }
    

    4)在共享文件夹中创建floder调用“EditorTemplates”。

    5)在“EditorTemplates”中创建视图。视图如下所示:

    @using Demo.Web.Helper
    @{
        var items = typeof (Test).GetItems((int?)Model);
    }    
    @Html.DropDownList("",items)
    

    在这里,您已经完成了所有帮助和模板,随时可以使用。如果要实现Enum Type数据,只需使用如下所示:

    <强>模型

    public class MyModel
    {
        public int Id { get; set; }
        //
        public Test Test { get; set; } 
    }
    

    查看

     @Html.DisplayFor(m => m.Test)
     or
     @Html.EditorFor(m => m.Test)
    

    希望它有所帮助。

    答案 1 :(得分:1)

    以下是我使用的内容。这是我在网上找到的东西的略微修改版本。我会在信用到期时给予信任,但我不记得我最初在哪里找到它:

    public static SelectList ToSelectList(this Enum enumeration)
    {
        var list = (from Enum d in Enum.GetValues(enumeration.GetType())
                    select new { Value = Enum.GetName(enumeration.GetType(), d), Text = d.GetDescription() }).ToList();
    
        var selectedValue = (int)Enum.Parse(enumeration.GetType(), Enum.GetName(enumeration.GetType(), enumeration));
    
        return new SelectList(list, "Value", "Text");
    }
    
    public static string GetDescription(this Enum en)
    {
        Type type = en.GetType();
        System.Reflection.MemberInfo[] memInfo = type.GetMember(en.ToString());
    
        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
    
            if (attrs != null && attrs.Length > 0)
                return ((System.ComponentModel.DataAnnotations.DisplayAttribute)attrs[0]).GetName();
        }
    
        return en.ToString();
    }
    

    在您看来,您可以使用它:

    @Html.DropDownListFor(m => m.MyEnumProperty, Model.MyEnumProperty.ToSelectList())