2010-03-15 10 views
8

Estoy usando dataannotations en una aplicación MVC2 y estoy un poco desalentado cuando trato de usar recursos de archivos RESX para mensajes de error.DataAnnotations and Resources no funcionan bien

He intentado lo siguiente, pero seguir recibiendo la excepción "Un argumento atributo debe ser una expresión constante, typeof expresión o expresión gama creación de un tipo de parámetro de atributo"

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

me siguen dando ese mensaje de error a menos que reemplace ErrorMessageResourceName con "Obligatorio" en lugar de Resources.ErrorMessages.Required.

¿Alguien puede decirme si estoy haciendo esto bien?

Respuesta

12

Sí, lo que estás haciendo al final es básicamente correcto. El ErrorMessageResourceName toma lo que el nombre implica, el nombre de un recurso, no el recurso en sí.

Resources.ErrorMessages.Required apunta al real (localizado) mensaje de error (recurso). El nombre del recurso es simplemente "Requerido", y el tipo del administrador de recursos (utilizado para ErrorMessageResourceType) es la clase que contiene ese recurso, en este caso la clase Resources.ErrorMessages.

lo tanto, su declaración debe tener este aspecto:

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

¿Puedo utilizar la propiedad ErrorMessage en su lugar? Prefiero escribir fuertemente .... – devlife

+4

@devlife: No. No, si quieres localización. Para eso son exactamente las propiedades del recurso. De hecho, así es con la localización * any *, en algún punto de la cadena tendrá que buscar una cadena de recursos basada en el nombre, así es como funcionan los recursos externalizados. Y esto sigue siendo "fuertemente tipado" en función de la clase de recursos, simplemente no tiene seguridad en tiempo de compilación en el nombre del recurso en sí. Si quieres eso, simplemente crea una clase como 'ResourceNames' con líneas como' public const string Required = "Required '', luego puedes especificarlas como los nombres de los recursos. – Aaronaught

Cuestiones relacionadas