使用 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;
}
}
我有一个枚举下拉菜单
//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;
}
}