Подтвердить что ты не робот

Отображение дружественных, локализованных значений перечисления с использованием 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
}

Это не поддерживается. Кажется, что-то еще нужно. Какой самый лучший способ его реализовать?

4b9b3361

Ответ 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. Надеюсь, это поможет!