DisplayName和DisplayFor的MVC全球化

时间:2015-07-11 09:56:38

标签: c# asp.net-mvc entity-framework globalization

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

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

var myObj = {};

casper.start('http://google.com', function(){
    myObj.someVar = 20;
});

casper.thenOpen('http://google.com/analytics', function(){
    console.log(myObj.someVar);
});

我设法通过使用以下内容在 Gender[Id, Name,ArabicName] Person[Id,FirstName,FatherName,FamilyName,ArabicFirstName, ArabicFatherName,ArabicFamilyName,GenderId] dropdownlist字段之间切换,根据资源显示所有Name

ArabicName

并使用以下内容显示 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;} FirstName ArabicFirstName之间切换,以及如何在MVC中实现此目标?

例如显示:DisplayFor

1 个答案:

答案 0 :(得分:1)

我做了以下解决方法以使工作正常

  1. 要区分资源文件中的标签和数据值,我使用了对象:
  2. 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 =&GT; m.FirstName)

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