0

我想爲我的ASP.NET MVC3網站編寫一個幫助器,它將能夠返回一個新的SelectList,其中包含一個枚舉的所有Description屬性標記在ASP.NET MVC3中使用顯示標記填充DropDownListFor

例如,具有以下枚舉:

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

    我該如何修改thi s直接「合併」它直接在我的@Html.DropDownListFor幫手?

    我在互聯網上看到過一些幫手,特別是herehere,但沒有人爲我工作。有沒有人能夠共享一個優雅幫手,它返回一個枚舉成員的所有Display屬性,以便將它們放在一個DropDownListFor

    回答

    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()) 
    
    +0

    我只是嘗試你的答案,因爲它是第一個。我在Tools \ Helpers \ AttributesHelperExtensions.cs中創建了兩個方法,這是一個靜態類,我寫了一些幫助器。在我看來,'ToSelectList()'不能識別...有沒有使用或我忘記的其他東西? – AlexB

    +0

    對不起。您還需要在視圖頂部指向擴展名的「@ using」指令。就像在C#代碼中的其他任何地方一樣,您必須讓編譯器知道在哪裏找到該方法。 –

    1

    爲了實現枚舉類型的數據,我認爲最簡單的方法是使用自定義的Enum helper和Templates。以下是我如何在我的項目中實施它們。

    1)創建枚舉助手

    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) 
    

    在這裏,您已完成所有助手和模板,可供使用。當你想實現枚舉類型的數據,只是用它象下面這樣:

    型號

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

    查看

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

    希望它能幫助。

    +0

    這是我還在尋找什麼。 – 2013-11-27 20:34:39

    +0

    對不起,遲到的答案。我非常喜歡你的解決方案,但是我已經實現了克里斯的解決方案,它與我所做的最接近,並且需要更少的修改來放置我自己的項目。但是,我upvoted你的答案;-)再次感謝! – AlexB