0

国を保持する列挙型があります:

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を使用して値をローカライズします。

次に、ローカライズされたすべての国の名前を含むドロップダウンリストを表示します。私はこのコードを思いつきます:

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ヘルパーがあります。

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ローカライズされた値を返すようにメソッドを変更するにはどうすればよいですか?

4

2 に答える 2

2

のプロパティではなくGetDisplayNameメソッドを使用するようにメソッドを更新する必要があります。GetName()NameDisplayAttribute

このような:

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

のMSDNドキュメントからDisplayAttribute.Name

このプロパティを使用して Name プロパティの値を取得しないでください。代わりに GetName メソッドを使用してください。

メソッドの MSDN ドキュメントには、次のように書かれGetName()ています。

ResourceType プロパティが指定されていて、Name プロパティがリソース キーを表している場合は、Name プロパティのローカライズされた文字列を返します。それ以外の場合は、Name プロパティのローカライズされていない値。

于 2013-05-11T09:35:16.870 に答える
0

私は同様の問題を抱えていました.表示属性をあなたと同じように設定しました. それが最も賢い、または最適化された方法だとは思いませんが、うまくいきます。うまくいけば、それはあなたが意図したものです。

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();
    }
于 2015-10-24T22:38:13.500 に答える