2010-12-15 88 views
4

Disons que je suis la classe et ENUM suivante:Comment localiser un ENUM et utiliser quelque chose de similaire à Html.SelectListFor <T>

public class MyModel 
{ 
    [DisplayName("Min egenskap")] 
    public MyEnum TheProperty {get;set;} 
} 

public enum MyEnum 
{ 
    [DisplayName("Inga från Sverige")] 
    OneValue, 

    [DisplayName("Ett annat värde")] 
    AnotherValue 
} 

Le code ci-dessus ne fonctionne pas depuis DisplayNameAttribute ne peut pas être utilisé sur les énumérations. Y a-t-il un autre attribut qui peut être utilisé?

Ce que je veux faire est de générer une belle étiquette html select en utilisant quelque chose comme Html.SelectListFor(m => m.TheProperty). La liste utiliserait l'attribut DisplayNameAttribute ou un attribut similaire pendant la génération.

résultat souhaité:

<select name="TheProperty"> 
<option value="OneValue">Inga från Sverige</option> 
<option value="AnotherValue" selected="selected">Ett annat värde</option> 
</select> 

Répondre

3

Un exemple de la façon de le faire est d'utiliser le [Description] attribut sur votre ENUM:

public enum DaysOfWeek 
{ 
    [Description("Monday")] 
    Monday = 1, 

    [Description("Tuesday")] 
    Tuesday = 2 
} 

Ensuite, créez cette classe EnumerationHelper qui vous permettra de obtenir l'attribut Description de votre énumération:

public static class EnumerationHelper 
{ 
    //Transforms an enumeration description into a string 
    public static string Description<TEnum>(this TEnum enumObject) 
    { 
     Type type = enumObject.GetType(); 
     MemberInfo[] memInfo = type.GetMember(enumObject.ToString()); 

     if(memInfo != null && memInfo.Length > 0) 
     { 
      DescriptionAttribute[] attributes = (DescriptionAttribute[])memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 

      if (attributes.Length > 0) 
      { 
       return attributes[0].Description; 
      } 
     } 

     return enumObject.ToString(); 

    } 
} 

Puis vous pouvez interroger votre classe enum pour obtenir la valeur et la description pour ensuite construire une SelectList. Vous devez faire référence à la EnumerationHelper dans cette classe:

var listOfDaysOfWeek = (from DaysOfWeek d in Enum.GetValues(typeof(DaysOfWeek)) 
         select new { ID = d, Description = d.Description() }); 

viewModel.selectListDaysOfWeek = new SelectList(listOfDaysOfWeek, "ID", "Description"); 

Et puis enfin à votre avis:

<%: Html.DropDownListFor(m => m.DayOfWeek, Model.DaysOfWeek) %> 

J'espère que cela aide.

3

Je voulais afficher le Enum dans la vue alors j'ai fait une aide similaire Html:

/// <summary> 
    /// Returns the [Description] value of a Enum member. 
    /// </summary> 
    /// <typeparam name="TModel"></typeparam> 
    /// <typeparam name="TResult"></typeparam> 
    /// <param name="helper"></param> 
    /// <param name="expression"></param> 
    /// <returns></returns> 
    public static MvcHtmlString DisplayEnumFor<TModel, TResult>(this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TResult>> expression) where TResult : struct { 
     TResult value = expression.Compile().Invoke(helper.ViewData.Model); 
     string propName = ExpressionHelper.GetExpressionText(expression); 

     var description = typeof(TResult).GetMember(value.ToString())[0] 
      .GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault(); 
     if (description != null) { 
      return MvcHtmlString.Create((description as DescriptionAttribute).Description); 
     } 

     return MvcHtmlString.Create(value.ToString()); 
    } 

Utilisation:

@Html.DisplayEnumFor(m => m.SomeEnumProperty)