DataAnnotations和Resources不能很好地发挥作用

dev*_*ife 9 globalization asp.net-mvc resx data-annotations

我在MVC2应用程序中使用数据注释,并且在尝试将RESX文件资源用于错误消息时有点气馁.

我已经尝试了以下但继续获得异常"属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式"

[Required(ErrorMessage = Resources.ErrorMessages.Required)]
[Required(ErrorMessageResourceName = Resources.ErrorMessages.Required,
          ErrorMessageResourceType = typeof(Resources.ErrorMessages)]
Run Code Online (Sandbox Code Playgroud)

我不断收到该错误消息,除非我替换ErrorMessageResourceName为"必需"而不是Resources.ErrorMessages.Required.

任何人都可以告诉我,如果我这样做的话吗?

Aar*_*ght 13

是的,你最后做的事情基本上是正确的.该ErrorMessageResourceName采取什么顾名思义,该名称的资源,而不是资源本身.

Resources.ErrorMessages.Required指向实际(本地化)错误消息(资源).资源的名称只是"必需",资源管理器的类型(用于ErrorMessageResourceType)是包含该资源的Resources.ErrorMessages类,在本例中是类.

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

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

  • @devlife:不.如果你想要本地化的话.这正是资源属性的用途.实际上,这就是*any*本地化的方式,在链中的某个点上,您将不得不根据名称查找资源字符串,这就是外部化资源的工作方式.这仍然是基于资源类的"强类型",您只是没有资源名称本身的编译时安全性.如果你想要它,只需创建一个像`ResourceNames`这样的类,其行如`public const string Required ="Required"`,然后你可以指定那些作为资源名称. (4认同)