使用 asp.net 样板在 EnumDropDownListFor 中进行本地化

Localization in EnumDropDownListFor using asp.net boilerplate

我有一个枚举下拉菜单

//control
 @Html.EnumDropDownListFor(
                        m => m.OrderBy,
                        new {@class = "btn btn-default dropdown-toggle toggle", onchange = "document.getElementById('hf_Pagename').value,this.form.submit();"})

//my enum
 public enum OrderByOptions
    {
        Default,
        PriceLowToHigh,
        PriceHighToLow,
        MostRecent
    }

现在的问题是我需要对它们进行本地化。但在这种情况下,从“PriceLowToHigh”需要更改为“Price- low to high”

您可以使用 AbpDisplayNameAttribute:

public enum OrderByOptions
{
    [AbpDisplayName(MyConsts.LocalizationSourceName, "OrderByOptions.Default")]
    Default,
    [AbpDisplayName(MyConsts.LocalizationSourceName, "OrderByOptions.PriceLowToHigh")]
    PriceLowToHigh,
    [AbpDisplayName(MyConsts.LocalizationSourceName, "OrderByOptions.PriceHighToLow")]
    PriceHighToLow,
    [AbpDisplayName(MyConsts.LocalizationSourceName, "OrderByOptions.MostRecent")]
    MostRecent
}

在您的本地化文件中定义它们:

<text name="OrderByOptions.PriceLowToHigh">Price - Low to High</text>

更新

AbpDisplayName works on type class

您可以定义:

[AttributeUsage(AttributeTargets.Field)]
public class FieldAbpDisplayNameAttribute : AbpDisplayNameAttribute
{
    // ...
}

那就用[FieldAbpDisplayNameAttribute(...)]代替。

有很多方法可以解决这个问题。

方式#1 不要使用@Html.EnumDropDownListFor!只需遍历枚举并创建 html 元素,如下所示; (我脑子里在写代码)

<select>
@foreach (var item in Enum.GetValues(typeof(OrderByOptions)))
{
  <option value="@((int)item)">@(Localize(item.ToString()))</option>   
}
</select>

没有本地化方法。只需按照您的方式进行本地化即可。

方式#2

其他替代方法是不使用枚举而是创建下拉项集合。并让一个项目由 DisplayText 和 Value 组成。显示文本必须从服务器本地化。

方式#3

按照此处说明的说明进行操作: https://ruijarimba.wordpress.com/2012/02/17/asp-net-mvc-creating-localized-dropdownlists-for-enums/

有了上面的信息,我的问题就这样解决了。

我创建了一个继承自 AbpDisplayNameAttribute 的客户属性 AbpEnumDisplayNameAttribute

[AttributeUsage(AttributeTargets.Field)]
public class AbpEnumDisplayNameAttribute : AbpDisplayNameAttribute
{
    /// <summary>
    /// <see cref="AbpDisplayNameAttribute"/> for enum values.
    /// </summary>
    public AbpEnumDisplayNameAttribute(string sourceName, string key) : base(sourceName, key)
    {
    }
}

然后我为 Enum 显示值本地化创建了一个扩展。

    public static class EnumLocalizationExtension
    {
        public static string ToLocalizedDisplayName(this Enum value)
        {
            var displayName = value.ToString();
            var fieldInfo = value.GetType().GetField(displayName);
            if (fieldInfo != null)
            {
                var attribute = fieldInfo.GetCustomAttributes(typeof(AbpEnumDisplayNameAttribute), true)
                      .Cast<AbpEnumDisplayNameAttribute>().Single();

                if (attribute != null)
                {
                    displayName = attribute.DisplayName;
                }
            }
            return displayName;
        }
    }