首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enum [显示(名称)本地化MVC 4

Enum [显示(名称)本地化MVC 4
EN

Stack Overflow用户
提问于 2013-02-05 23:59:04
回答 2查看 2.1K关注 0票数 0

我有一个包含国家的枚举:

代码语言:javascript
复制
public enum CountryEnum
{
    [Display(Name = "AF", ResourceType = typeof(Global))]
    AF,

    [Display(Name = "AL", ResourceType = typeof(Global))]
    AL,

    [Display(Name = "DZ", ResourceType = typeof(Global))]
    DZ,
};

如您所见,我使用DataAnnotations来本地化这些值。

现在我想显示一个包含所有本地化国家/地区名称的下拉列表。我想出了这个代码:

代码语言:javascript
复制
public static string GetDisplayName<TEnum>(TEnum value)
{        
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DisplayAttribute[] attributes = 
        (DisplayAttribute[])fi.GetCustomAttributes(
            typeof(DisplayAttribute), false);

        if ((attributes != null) && (attributes.Length > 0))
            return attributes[0].Name;
        else
            return value.ToString();
}

我有一个使用上述方法的Html帮助器:

代码语言:javascript
复制
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes)
{
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    Type enumType = GetNonNullableModelType(metadata);
    IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();

    IEnumerable<SelectListItem> items = from value in values
                                        select new SelectListItem
                                        {
                                            Text = GetDisplayName(value),
                                            Value = value.ToString(),
                                            Selected = value.Equals(metadata.Model)
                                        };

    // If the enum is nullable, add an 'empty' item to the collection
    if (metadata.IsNullableValueType)
        items = SingleEmptyItem.Concat(items);

    return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
}

DropDown渲染正确,但是,GetDisplayName不返回本地化的值,它只显示名称属性(例如,第一个条目的AF )。

如何修改GetDisplayName方法返回本地化后的值?

EN

回答 2

Stack Overflow用户

发布于 2013-05-11 17:35:17

您需要更新GetDisplayName方法以使用GetName()方法,而不是DisplayAttributeName属性。

如下所示:

代码语言:javascript
复制
public static string GetDisplayName<TEnum>(TEnum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DisplayAttribute[] attributes = (DisplayAttribute[])fi.
        GetCustomAttributes(typeof(DisplayAttribute), false);

    if ((attributes != null) && (attributes.Length > 0))
        return attributes[0].GetName();
    else
        return value.ToString();
}

来自DisplayAttribute.Name的MSDN文档

不使用此属性获取Name属性的值。请改用GetName方法。

GetName()方法的MSDN文档中有这样的说明:

如果已指定ResourceType属性并且Name属性表示资源键,则

返回Name属性的本地化字符串;否则返回Name属性的未本地化的值。

票数 2
EN

Stack Overflow用户

发布于 2015-10-25 06:38:14

我遇到了一个类似的问题,像您一样设置了Display属性(因为类使用相同的属性来加载本地化,所以更容易),所以使用您的初始代码并对其进行了一些调整,现在它可以按预期显示本地化字符串。我不认为这是最聪明或最优化的方式,但它是有效的。希望这就是你想要的。

代码语言:javascript
复制
public static string GetDisplayName<TEnum>(TEnum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DisplayAttribute[] attributes = (DisplayAttribute[])fi.
            GetCustomAttributes(typeof(DisplayAttribute), false);

        if ((attributes != null) && (attributes.Length > 0))
        {
            string key = attributes[0].Name;
            string localizedString = attributes[0].ResourceType.GetProperty(key).GetValue("").ToString();
            return localizedString;
        }
        else
            return value.ToString();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14711598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档