2010-03-15 14 views
8

J'utilise des notifications de données dans une application MVC2 et je suis un peu découragé lorsque j'essaie d'utiliser les ressources du fichier RESX pour les messages d'erreur.DataAnnotations et ressources ne sont pas très bien

J'ai essayé ce qui suit, mais continue à recevoir l'exception « Un argument d'attribut doit être une expression constante, expression typeof ou un tableau d'expression de la création d'un type de paramètre d'attribut »

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

Je continue à recevoir ce message d'erreur sauf si je remplace ErrorMessageResourceName par "Obligatoire" au lieu de Resources.ErrorMessages.Required.

Quelqu'un peut-il me dire si je fais ça correctement?

Répondre

12

Oui, ce que vous faites à la fin est fondamentalement correct. Le ErrorMessageResourceName prend ce que son nom implique, le nom d'une ressource, pas la ressource elle-même.

Resources.ErrorMessages.Required pointe vers le réel (localisé) message d'erreur (ressource). Le nom de la ressource est simplement "requis" et le type du gestionnaire de ressources (utilisé pour ErrorMessageResourceType) est la classe qui contient cette ressource, dans ce cas la classe Resources.ErrorMessages.

Ainsi, votre déclaration devrait ressembler à ceci:

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

Puis-je utiliser la propriété ErrorMessage à la place? Je préfère fortement typé .... – devlife

+4

@devlife: Non. Pas si vous voulez la localisation. C'est exactement ce à quoi servent les propriétés de la ressource. En fait, c'est comme ça avec la localisation * any *, à un moment donné dans la chaîne, vous devrez rechercher une chaîne de ressources basée sur le nom, c'est ainsi que fonctionnent les ressources externalisées. Et ceci est toujours "fortement typé" basé sur la classe de ressources, vous n'avez tout simplement pas de sécurité à la compilation sur le nom de la ressource elle-même. Si vous voulez cela, créez simplement une classe comme 'ResourceNames' avec des lignes comme' public const string Required = "Required" ', vous pouvez alors les spécifier comme noms de ressources. – Aaronaught