开发者

Displaying friendly, localized enum values using DataAnnotations in ASP.NET MVC2

开发者 https://www.devze.com 2023-01-12 01:10 出处:网络
What\'s the recommended way to display localized enum properties in MVC2? If I have a model like this:

What's the recommended way to display localized enum properties in MVC2?

If I have a model like this:

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

and a line in the view like this:

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

I was hoping to just annotate the enum values with DisplayAttribute like this:

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", ResourceT开发者_高级运维ype=typeof(Resources.MyEnumResources))]
    EnumValue3
}

That's not supported. It seems there's something else needed. What's the nicest way to implement it?


You can try using the DescriptionAttribute for this.

E.g.

In the view model:

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;
        }

In the view:

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

I am using something similar to set the displayname and value in my Html.Dropdown.


I also use the Display annotation. Here's what I ended up using, which works for BOTH a property and enum members.

Here's my 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
}

Then my little do-it-all utility method:

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;
}

This can then be used this way to obtain a single member display property for an enum member:

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

Or a property:

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

I love Generics. Hope this helps!!

0

精彩评论

暂无评论...
验证码 换一张
取 消