C# DisplayName和DisplayFor的MVC全球化

C# DisplayName和DisplayFor的MVC全球化,c#,asp.net-mvc,entity-framework,globalization,C#,Asp.net Mvc,Entity Framework,Globalization,我正在使用MVC开发一个多语言(英语、阿拉伯语)应用程序。此应用程序应显示基于资源文件的标签和数据 例如,数据库设计用于将翻译后的字段存储在相同的表中 Gender[Id, Name,ArabicName] Person[Id,FirstName,FatherName,FamilyName,ArabicFirstName, ArabicFatherName,ArabicFamilyName,GenderId] 通过在Name和ArabicName字段之间切换,我成

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

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

  Gender[Id, Name,ArabicName]
  Person[Id,FirstName,FatherName,FamilyName,ArabicFirstName,
           ArabicFatherName,ArabicFamilyName,GenderId]
通过在
Name
ArabicName
字段之间切换,我成功地根据资源显示了所有
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
还可以使用以下方式显示
标签:

[Display(Name="FirstName", ResourceType =typeof(Resources.Global))]
public string FirstName{get;set;}
我的问题是,是否可以使用
DisplayFor
FirstName
值和
ArabicFirstName
之间切换,以及如何在MVC中实现这一点


例如,要显示:
FirstName=Antony表示英语,arabicffirstname=انطوا表示阿拉伯语

  • 为了区分资源文件中的标签和数据值,我使用了约定:
  • FirstName
    代表标签,
    FirstNameResource
    代表数据

    示例资源文件如下所示:

       FirstName => value = First Name (for english), الاسم الاول (for arabic)
       FirstNameResource = > value = FirstName ( for english) , ArabicFirstName (for arabic)
    
  • 我编写了以下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);
    }
    
    public static MvcHtmlString DisplayResourceFor(此HtmlHelper帮助程序,
    表达式(表达式)
    {
    var rm=new ResourceManager(“Resources.Global”,
    系统、反射、组装、加载(“App_GlobalResources”);
    var resource=rm.GetString(string.Format(“{0}资源”),
    GetExpressionText(表达式));
    var value=helper.ViewContext.ViewData.GetViewDataInfo(resource.value.ToString();
    返回MvcHtmlString.Create(值);
    }
    
  • 您可以按如下方式使用此扩展:

    @DisplayResourceFor(m=>m.FirstName)


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

    您可以使用相同的显示在模型中添加类似的内容,并使用FirstName1而不是FirstName[NotMapped]公共字符串FirstName1{get{return.Dictionary.Dict.ResourceManager.GetString(FirstName);}