Отображение дружественных, локализованных значений перечисления с использованием DataAnnotations в ASP.NET MVC2 - PullRequest
18 голосов
/ 19 августа 2010

Каков рекомендуемый способ отображения локализованных свойств перечисления в MVC2?

Если у меня есть модель, подобная этой:

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

и строка в виде, подобном этому:

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

Я надеялся просто аннотировать значения перечисленияс 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
}

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

Ответы [ 2 ]

7 голосов
/ 20 августа 2010

Вы можете попробовать использовать Атрибут Description для этого.

Например

В модели вида:

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.

3 голосов
/ 07 февраля 2014

Я также использую аннотацию Display. Вот то, что я в конечном итоге использовал, который работает для ОБА свойства и членов enum.

Вот мое перечисление:

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
}

Тогда мой маленький универсальный метод:

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");

Я люблю дженерики. Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...