我有一个.net核心项目,在我的一个视图中我必须显示 DisplayName以英文和阿拉伯文显示在同一视图中 只有我获得一种语言,因为视图具有本地化资源文件
我创建了一个扩展方法,它接受模型并返回DisplayName元数据 实际上我的方法和原始的@html帮助器返回一种语言 这里的方法我希望有人可以修改它,以便它返回原始的英文元数据而不是本地化的值
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
using System;
using System.Linq.Expressions;
namespace iSee.IHtmlHelpers
{
public static class HtmlExtensions
{
public static IHtmlContent DisplayNameForEn<TModel, TValue>(
this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression
)
{
var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, htmlHelper.ViewData, htmlHelper.MetadataProvider);
var metadata = modelExplorer.Metadata;
var DisplayName = metadata.DisplayName;
return new HtmlString(DisplayName);
}
}
}
答案 0 :(得分:1)
您可以使用以下示例中的代码执行此操作。
public static IHtmlContent DisplayNameFor<TModel, TValue>(
this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression,CultureInfo culture
)
{
if (culture == null)
{
culture = CultureInfo.CurrentCulture;
}
var displayAttribute = (expression.Body as MemberExpression)?.Member.GetCustomAttributes()
.FirstOrDefault(tt => tt is DisplayAttribute) as DisplayAttribute;
if (displayAttribute == null)
{
return new HtmlString("");
}
var resourceType = displayAttribute.ResourceType;
var name = displayAttribute.Name;
if(resourceType == null)
{
return new HtmlString(name);
}
var resourceManager = new global::System.Resources.ResourceManager(resourceType);
var displayName = resourceManager.GetString(name, culture);
return new HtmlString(displayName);
}
通常,您希望使用DisplayAttribute.ResourceType
和DisplayAttribute.Name
,然后使用资源管理器以及要翻译的语言的文化信息。
编辑2:
.NET Core上可能存在的异常是由于.NET Core中.resx文件的使用方式的变化。使上述方法更适合.NET Framework应用程序和第一个 EDIT 的IStringLocalizer<T>
解决方案更适合ASP.NET Core
修改强>
您还可以使用ASP.NET Core的IStringLocalizer<T>
功能在此处找到一些参考:Globalization and Localization。例如,您可以更新上述方法以使用IStringLocalizer
var culture = new CultureInfo("en-gb");
var localizer = factory.Create(typeof(Startup));
var specificLoc = localizer.WithCulture(culture);
答案 1 :(得分:0)
感谢@Nick Polideropoulos,上面的答案很有帮助,并激励我找到问题的答案 这里是答案,以防其他人搜索
ListOfRoles = db.Users.Where(x=>x.UserId == o.UserId).Select(x=>x.AspNetUsers.AspNetRoles)