在 ASP.net core mvc 3.1 中的 HtmlHelper 扩展方法中使用 DataAnnotation 本地化器
Posted
技术标签:
【中文标题】在 ASP.net core mvc 3.1 中的 HtmlHelper 扩展方法中使用 DataAnnotation 本地化器【英文标题】:Using DataAnnotation localizer in your extension method for HtmlHelper in ASP.net core mvc 3.1 【发布时间】:2020-08-08 09:35:39 【问题描述】:我希望对 html Helper 进行扩展,以显示我的 ViewModel 属性的描述。这是列表,因为自从How do I display the DisplayAttribute.Description attribute value? 以来,ASP.NET Core 3.1 中的事情发生了变化。
这是我的扩展方法:
public static string DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> self, Expression<Func<TModel, TValue>> expression)
MemberExpression memberExpression = (MemberExpression)expression.Body;
var displayAttribute = (DisplayAttribute)memberExpression.Member.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault();
string description = displayAttribute?.Description ?? memberExpression.Member?.Name;
//But how can i localize this description
return description;
但现在我需要对其进行本地化,例如
@Html.DisplayNameFor(model => model.MyNotObviousProperty)
如何在我的扩展方法中检索 DataAnnotationLocalizer?当然,我可以像参数一样传递它,但是当DisplayNameFor
不要求额外的参数时,它不是很好的解决方案。
【问题讨论】:
【参考方案1】:您只需要获得对IStringLocalizer
的引用。
在您的创业公司中:
public void Configure(..., IStringLocalizer stringLocalizer) // ASP.NET Core will inject it for you
// your current code
YourExtensionsClass.RegisterLocalizer(stringLocalizer);
在你的扩展类中:
public static class YourExtensionsClass
private static IStringLocalizer _localizer;
public static void RegisterLocalizer(IStringLocalizer localizer)
_localizer = localizer;
public static string DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> self, Expression<Func<TModel, TValue>> expression)
MemberExpression memberExpression = (MemberExpression)expression.Body;
var displayAttribute = (DisplayAttribute)memberExpression.Member.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault();
string description = displayAttribute?.Description ?? memberExpression.Member?.Name;
return _localizer[description];
如果你想要更多的控制,我建议你从 ASP.NET Core 内部的工作中获得一些想法,by taking a look at the source code (method CreateDisplayMetadata)。
【讨论】:
谢谢!我有自己的 IStringLocalizerFactory 将类型转换为合适的资源位置,因为资源文件位置的默认约定对我的项目来说不是很舒服。所以我改变了方法:description = _LocalizerFactory.Create(memberExpression.Expression.Type)[description];以上是关于在 ASP.net core mvc 3.1 中的 HtmlHelper 扩展方法中使用 DataAnnotation 本地化器的主要内容,如果未能解决你的问题,请参考以下文章
通过 ASP.NET Core 3.1/5.0 MVC 中的脚本使用选定的 ''value='' 填充数据库
从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用
在 2 个控制器 ASP.NET Core 3.1 MVC 之间传递 ID
asp.net core 3.1 MVC/WebApi JSON 全局配置