如何在.net核心视图中显示英文DisplayName而不是本地化字符串

时间:2017-06-03 04:01:29

标签: c# asp.net-core asp.net-core-mvc

我有一个.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);
        }
    }
}

2 个答案:

答案 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.ResourceTypeDisplayAttribute.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)