在MVC2中显示本地化枚举属性的推荐方法是什么?
如果我有这样的模型:
public class MyModel {
public MyEnum MyEnumValue { get; set; }
}
和视图中的一行如下:
<%: Html.DisplayFor(model => model.MyEnumValue) %>
我希望只用这样的DisplayAttribute
注释enum值:
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
}
不支持。似乎还需要其他东西。实现它的最好方法是什么?
答案 0 :(得分:7)
您可以尝试使用DescriptionAttribute。
E.g。
在视图模型中:
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中的displayname和value。
答案 1 :(得分:3)
我也使用了显示注释。这是我最终使用的内容,它适用于属性和枚举成员。
这是我的枚举:
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");
我喜欢泛型。希望这会有所帮助!!