DisplayName 和 DisplayFor 的 MVC 全球化

MVC Globalization for DisplayName and DisplayFor

我正在使用 MVC 开发多语言(英语、阿拉伯语)应用程序。此应用程序应显示标签和基于资源文件的数据。

例如,数据库旨在将翻译后的字段存储在相同的表中

  Gender[Id, Name,ArabicName]
  Person[Id,FirstName,FatherName,FamilyName,ArabicFirstName,
           ArabicFatherName,ArabicFamilyName,GenderId]

我通过在 NameArabicName 字段之间切换,设法根据资源显示所有 dropdownlist

        ViewBag.Gender= new SelectList(mEntities.Genders.ToList(), "Id",
                                       Resources.Global.Name);
    // Name value in the Global.resx is Name and in Global.ar.resx is ArabicName

并且还通过显示 LabelFor 使用:

[Display(Name="FirstName", ResourceType =typeof(Resources.Global))]
public string FirstName{get;set;}

我的问题是,是否可以使用 DisplayForFirstName ArabicFirstName 之间切换,以及如何在 MVC 中实现这一点?

例如显示:FirstName = Antony for english , ArabicFirstName = انطوان for arabic

我采取了以下解决方法来使事情正常进行

  1. 为了区分资源文件中的标签和数据值,我使用了约定:

FirstName代表标签,FirstNameResource代表数据

资源文件示例如下:

   FirstName => value = First Name (for english), الاسم الاول (for arabic)
   FirstNameResource = > value = FirstName ( for english) , ArabicFirstName (for arabic)
  1. 我编写了以下 HtmlHelper

     public static MvcHtmlString DisplayResourceFor<TModel, TValue>(this HtmlHelper<TModel> helper, 
        Expression<Func<TModel, TValue>> expression)
    {
        var rm = new ResourceManager("Resources.Global", 
            System.Reflection.Assembly.Load("App_GlobalResources"));
        var resource = rm.GetString(string.Format("{0}Resource", 
            ExpressionHelper.GetExpressionText(expression)));
        var value = helper.ViewContext.ViewData.GetViewDataInfo(resource).Value.ToString();
        return MvcHtmlString.Create(value);
    }
    
  2. 您可以按如下方式使用此扩展程序:

    @Html.DisplayResourceFor(m=>m.FirstName)

这个解决方法帮助我解决了问题,但也许还有另一个直接的解决方案。