【问题标题】:Is it possible to use a variable for the `[Display(Name="Something")]` data annotation in MVC3 (C#)是否可以在 MVC3 (C#) 中为 `[Display(Name="Something")]` 数据注释使用变量
【发布时间】:2012-07-24 04:19:42
【问题描述】:

不知道为什么,但 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 是动态生成的字符串。

【问题讨论】:

    标签: c# asp.net-mvc-3 data-annotations resx


    【解决方案1】:

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

    只需使用:

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

    【讨论】:

    • 哦,对了,我一直在使用我的数据库来存储所有本地化文本,我想你们都会告诉我现在这样做是错误的..... ;-)
    • 不,但您将成为数据库资源提供者:weblogs.asp.net/thangchung/archive/2010/06/25/…
    • 我花了一天时间切换到使用.resx XML 文件来存储我的文本,因为按照您(和其他人)的回答,我决定这是要走的路。 Romias 或@AdamTuliper,您知道我如何请求具有变量名的资源吗?这次不是在数据属性的上下文中,而是在控制器和视图中。基本上目前我正在使用@Resources.SomeKey 获取资源,但我希望能够在@Resources["SomeOtherKey"] 的函数中使用它,其中SomeOtherKey 是动态生成的字符串。也会更新问题
    • ResourceSet resset = ResourceManager.GetResourceSet(culture, true, false); resset.GetString("myToken")
    • 我的ResourceManager 似乎没有GetResourceSet() 方法:-(
    【解决方案2】:

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

    【讨论】:

    • 实际上,这适用于所有属性,而不仅仅是 DataAnnotations,但您的想法是正确的。
    • 这就是我的想法,但问题是为什么以及是否存在。
    【解决方案3】:

    您只能分配常量。

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

    【讨论】:

      【解决方案4】:

      您可能需要检查Hanselman's post 关于国际化的信息。也许它可以帮助

      【讨论】:

        【解决方案5】:
        [Display(Name = "strResourceString", ResourceType = typeof(Resourcefile.strResourceString))]
        

        【讨论】:

        • 问题是问是否可以使用变量;不是资源。
        猜你喜欢
        • 1970-01-01
        • 2011-06-09
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 2012-03-03
        • 2014-12-05
        • 1970-01-01
        相关资源
        最近更新 更多