是否可以在MVC3(C#)中使用`[Display(Name ="Something")]`数据注释的变量

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是一个动态生成的字符串.

Rom*_*ias 7

如果您在资源文件中拥有已翻译的属性名称,则支持开箱即用...无需扩展框架.

只需使用:

[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)