C# DisplayName和DisplayFor的MVC全球化
我正在使用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字段之间切换,我成
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);}