2010-08-19 11 views
18

¿Cuál es la forma recomendada de mostrar propiedades de enumeración localizadas en MVC2?Visualización de valores de enum amigables y localizados utilizando Anotaciones de datos en ASP.NET MVC2

Si tengo un modelo como este:

public class MyModel { 
    public MyEnum MyEnumValue { get; set; } 
} 

y una línea en la vista de la siguiente manera:

<%: Html.DisplayFor(model => model.MyEnumValue) %> 

Me esperaba que acaba de anotar los valores de enumeración con DisplayAttribute así:

public enum MyEnum 
{ 
    [Display(Name="EnumValue1_Name", ResourceType=typeof(Resources.MyEnumResources))] 
    EnumValue1, 
    [Display(Name="EnumValue2_Name", ResourceType=typeof(Resources.MyEnumResources))] 
    EnumValue2, 
    [Display(Name="EnumValue3_Name", ResourceType=typeof(Resources.MyEnumResources))] 
    EnumValue3 
} 

Eso no es compatible. Parece que se necesita algo más. ¿Cuál es la mejor manera de implementarlo?

+0

¿Qué desea mostrar como resultado final? – madcapnmckay

+0

La traducción adecuada del archivo de recursos, es decir, EnumValue1_Name, etc. –

+0

eche un vistazo a esta pregunta, ¡puede ser útil! http://stackoverflow.com/questions/3431515/in-asp-net-mvc-can-i-make-a-default-editor-template-for-enum –

Respuesta

7

Puede intentar usar la Atribución de Descripción para esto.

E.g.

En el modelo de vista:

public enum MyEnum 
     { 
      [Description("User Is Sleeping")] 
      Asleep, 
      [Description("User Is Awake")] 
      Awake 
     } 

public string GetDescription(Type type, string value) 
     { 
      return ((DescriptionAttribute)(type.GetMember(value)[0].GetCustomAttributes(typeof(DescriptionAttribute), false)[0])).Description; 
     } 

En la vista:

Model.GetDescription(Model.myEnum.GetType(), Model.myEnum) to retrieve the value set in Description. 

estoy usando algo similar para establecer el idioma y el valor en mi Html.Dropdown.

+1

Claro, pero eso no está localizado. Y las vistas necesitan saber si están mostrando un Enum u otra cosa, y esperaba separar esa preocupación. Esperaba extender el ModelMetadataProvider o algo así. Publicaré la respuesta si la encuentro. –

+1

Sí, tienes razón. Esto no funcionará para la req localización. Aunque me quedaré con la publicación. Alguien podría encontrarlo útil para otros escenarios. –

+1

Sí, lo encontré útil, gracias. – empo

3

También uso la anotación de la pantalla. Esto es lo que terminé usando, que funciona tanto para los miembros de la propiedad como de enum.

Aquí es mi enumeración:

public enum TagOrderStatus 
{ 
    [Display(ResourceType = typeof(TagStrings), Name = "TagOrderStatus_NotOrdered")] 
    NotOrdered = 0, 
    [Display(ResourceType = typeof(TagStrings), Name = "TagOrderStatus_ToOrder")] 
    ToOrder = 1, 
    [Display(ResourceType = typeof(TagStrings), Name = "TagOrderStatus_Ordered")] 
    Ordered = 2 
} 

Entonces mi pequeño do-it-all método de utilidad:

public static string GetLocalizedDisplay<TModel>(string pPropertyName) 
{ 
    DisplayAttribute attribute; 

    if (typeof(TModel).IsEnum) 
    { 
     MemberInfo member = typeof(TModel).GetMembers().SingleOrDefault(m => m.MemberType == MemberTypes.Field && m.Name == pPropertyName); 
     attribute = (DisplayAttribute)member.GetCustomAttributes(typeof(DisplayAttribute), false)[0]; 
    } 
    else 
    { 
     PropertyInfo property = typeof(TModel).GetProperty(pPropertyName); 
     attribute = (DisplayAttribute)property.GetCustomAttributes(typeof(DisplayAttribute), true)[0]; 
    } 

    if (attribute.ResourceType != null) 
     return new ResourceManager(attribute.ResourceType).GetString(attribute.Name); 
    else 
     return attribute.Name; 
} 

Esto se puede entonces utilizar esta forma para obtener una única propiedad de presentación miembro de una enumeración miembro de:

string disp = GetLocalizedDisplay<Tag.TagOrderStatus>("Ordered"); 

o una propiedad:

string disp = GetLocalizedDisplay<Tag>("OwnerName"); 

I love Generics. ¡¡Espero que esto ayude!!

Cuestiones relacionadas