Отображение дружественных, локализованных значений перечисления с использованием DataAnnotations в ASP.NET MVC2
Какой рекомендуемый способ отображения локализованных свойств перечисления в MVC2?
Если у меня есть такая модель:
public class MyModel {
public MyEnum MyEnumValue { get; set; }
}
и строку в виде:
<%: Html.DisplayFor(model => model.MyEnumValue) %>
Я надеялся просто аннотировать значения enum с помощью DisplayAttribute
следующим образом:
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
}
Это не поддерживается. Кажется, что-то еще нужно. Какой самый лучший способ его реализовать?
Ответы
Ответ 1
Вы можете попробовать использовать DescriptionAttribute для этого.
например.
В модели просмотра:
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;
}
В представлении:
Model.GetDescription(Model.myEnum.GetType(), Model.myEnum) to retrieve the value set in Description.
Я использую нечто похожее, чтобы установить отображаемое имя и значение в моем Html.Dropdown.
Ответ 2
Я также использую аннотацию Display. Здесь то, что я закончил использовать, которое работает для BOTH свойств и членов перечисления.
Здесь мое перечисление:
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
}
Затем мой маленький полезный метод do-it-all:
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;
}
Затем этот способ можно использовать для получения свойства отображения одного элемента для члена перечисления:
string disp = GetLocalizedDisplay<Tag.TagOrderStatus>("Ordered");
Или свойство:
string disp = GetLocalizedDisplay<Tag>("OwnerName");
Мне нравится Generics. Надеюсь, это поможет!