Ben*_*Ben 4 c# resx data-annotations asp.net-mvc-3
不知道为什么,但MVC3中的数据注释坚持使用常量值,我无法理解错误消息和显示名称等内容.我喜欢这些注释,它们易于使用且功能强大,但如果您需要支持多种语言,该怎么办?
想象一下,我有以下型号:
public class Person
{
public string First_Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我不改变任何东西并使用MVC3将为我构建的CRUD视图,我在"First_Name"的文本字段旁边得到一个标签,所以我添加数据注释来更改显示名称,如下所示:
public class Person
{
[Display(Name="First name")]
public string First_Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
哪个工作得很好.但我想根据用户语言提供不同的显示名称,使用我之前制作的函数GetDisplayName(string ToGet, string Language),它只返回我感兴趣的字符串,但是如果我将我的数据注释更改为:
public class Person
{
[Display(Name=GetDisplayName("First_Name", "English"))]
public string First_Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我得到编译器错误告诉我注释需要一个常量值,为什么????
有谁知道一种方法来完成我想要做的事情?谢谢
UPDATE
好吧,看来最好的方法是.resx根据下面的几个答案和其他帖子中的资源文件.这在大多数情况下都很有效.
有谁知道我如何请求具有变量名称的资源?这次不是在数据属性的上下文中,而是在控制器和视图中.
基本上在我获取资源的那一刻,@Resources.SomeKey但我希望能够在一个函数中使用它在@Resources["SomeOtherKey"]哪里SomeOtherKey是一个动态生成的字符串.
如果您在资源文件中拥有已翻译的属性名称,则支持开箱即用...无需扩展框架.
只需使用:
[Display(Name = "Resource_Key", ResourceType = typeof(DataFieldLabels))]
public string myProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
其中"Resource_Key"是资源文件中的键..."DataFieldLabels"是基本资源文件的名称.
编辑:
为了动态访问资源文件,您可以执行以下操作:
ResourceSet resset = ResourceManager.GetResourceSet(culture, true, false);
var translated = resset.GetString("myToken")
Run Code Online (Sandbox Code Playgroud)