4

不知道为什么,但是 MVC3 中的数据注释坚持使用常量值,对于错误消息和显示名称之类的东西我无法理解。我喜欢这些注释,它们非常易于使用且功能强大,但是如果您需要支持多种语言怎么办?

想象一下我有以下模型:

public class Person
{
    public string First_Name { get; set; }
}

如果我不更改任何内容并使用 MVC3 将为我构建的 CRUD 视图,我会在显示“First_Name”的文本字段旁边获得一个标签,因此我添加数据注释以更改显示名称,如下所示:

public class Person
{
    [Display(Name="First name")]
    public string First_Name { get; set; }
}

哪个工作得很好。但我想根据用户语言提供不同的显示名称,使用我之前创建的函数GetDisplayName(string ToGet, string Language),它只返回我感兴趣的字符串,但如果我将数据注释更改为:

public class Person
{
    [Display(Name=GetDisplayName("First_Name", "English"))]
    public string First_Name { get; set; }
}

然后我得到一个编译器错误,告诉我注释需要一个常量值,为什么????

有谁知道一种方法来完成我想要做的事情?谢谢

更新

好的,似乎最好的方法是.resx根据下面的几个答案和其他帖子中的答案使用资源文件。在大多数情况下效果很好。

有谁知道我如何请求具有变量名的资源?这次不是在数据属性的上下文中,而只是在控制器和视图中。

基本上目前我正在获取资源,@Resources.SomeKey但我希望能够在动态生成的字符串的函数中使用@Resources["SomeOtherKey"]SomeOtherKey

4

5 回答 5

7

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

只需使用:

[Display(Name = "Resource_Key", ResourceType = typeof(DataFieldLabels))]
public string myProperty { get; set; }

其中“Resource_Key”是资源文件中的键......而“DataFieldLabels”是基本资源文件的名称。

编辑:

为了动态访问资源文件,您可以执行以下操作:

ResourceSet resset = ResourceManager.GetResourceSet(culture, true, false);
var translated = resset.GetString("myToken")
于 2012-07-25T17:54:53.937 回答
1

您只能分配常量。

您可以进行扩展并在那里分配 keyValues,然后扩展从其他地方获取,例如数据库或资源文件或 Web 服务或其他任何地方。

于 2012-09-21T17:10:20.393 回答
1

DataAnnotations 参数值需要常量,即实际字符串。

于 2012-07-25T17:07:10.880 回答
0

您可能想查看Hanselman关于国际化的帖子。也许它可以帮助

于 2012-07-25T16:56:20.730 回答
-1
[Display(Name = "strResourceString", ResourceType = typeof(Resourcefile.strResourceString))]
于 2012-09-21T11:29:08.580 回答