【问题标题】:Localization in EnumDropDownListFor using asp.net boilerplate使用 asp.net 样板在 EnumDropDownListFor 中进行本地化
【发布时间】:2017-10-09 08:36:58
【问题描述】:

我有一个枚举下拉菜单

//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”

【问题讨论】:

    标签: asp.net aspnetboilerplate


    【解决方案1】:

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

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

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

    没有 Localize 方法。只需按照自己的方式本地化即可。

    方式#2

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

    方式#3

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

    【讨论】:

    • 哇,这太棒了!比设置绑定到资源的自定义属性更容易(至少在我们的架构中)。现在我们可以使用普通枚举并在视图级别对它们进行本地化
    【解决方案2】:

    你可以使用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 适用于类型类

    你可以定义:

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

    然后改用[FieldAbpDisplayNameAttribute(...)]

    【讨论】:

    • 鉴于您没有添加任何额外的本地化源,MyConsts.LocalizationSourceName 变量应该是什么样子?我找不到默认名称应该是什么
    【解决方案3】:

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

    我创建了一个继承自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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多