【问题标题】:DataAnnotations and Resources don't play nicelyDataAnnotations 和 Resources 不能很好地发挥作用
【发布时间】:2010-03-15 23:19:07
【问题描述】:

我在 MVC2 应用程序中使用数据注释,但在尝试使用 RESX 文件资源来获取错误消息时,我有点气馁。

我尝试了以下方法,但不断收到异常“属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式”

[Required(ErrorMessage = Resources.ErrorMessages.Required)]
[Required(ErrorMessageResourceName = Resources.ErrorMessages.Required,
          ErrorMessageResourceType = typeof(Resources.ErrorMessages)]

除非我将 ErrorMessageResourceName 替换为“必需”而不是 Resources.ErrorMessages.Required,否则我会不断收到该错误消息。

谁能告诉我这样做是否正确?

【问题讨论】:

    标签: asp.net-mvc data-annotations globalization resx


    【解决方案1】:

    是的,你最后所做的基本上是正确的。 ErrorMessageResourceName 顾名思义,是资源的名称,而不是资源本身。

    Resources.ErrorMessages.Required 指向实际(本地化)错误消息(资源)。资源的 name 只是“必需”,资源管理器的 type(用于ErrorMessageResourceType)是包含该资源的类,在这种情况下Resources.ErrorMessages 类。

    所以你的声明应该是这样的:

    [Required(ErrorMessageResourceType = typeof(Resources.ErrorMessages),
        ErrorMessageResourceName = "Required")]
    public string Something { get; set; }
    

    【讨论】:

    • @devlife:不。如果你想要本地化,那就不行。这正是资源属性的用途。事实上,这就是 any 本地化的方式,在链中的某个位置,您将不得不根据名称查找资源字符串,这就是外部化资源的工作方式。这仍然是基于资源类的“强类型”,只是资源名称本身没有编译时安全性。如果你想这样,只需创建一个像 ResourceNames 这样的类,使用像 public const string Required = "Required" 这样的行,然后你可以将它们指定为资源名称。
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多