2010-04-12 5 views
3

Ma tâche consiste à modifier la propriété ErrorMessage de l'attribut de validation DataAnnotation dans MVC2.0. Par exemple je devrais pouvoir passer un ID au lieu du message d'erreur réel pour la propriété Model et utiliser cet ID pour récupérer du contenu (message d'erreur) d'un autre service par exemple base de données et afficher ce message d'erreur dans la vue au lieu du ID. Pour ce faire, j'ai besoin de définir la propriété ErrorMessage de l'attribut de validation DataAnnotation.Comment faire pour modifier la propriété ErrorMessage de la validation DataAnnotation dans MVC2.0

[StringLength(2, ErrorMessage = "EmailContentID.")] 
    [DataType(DataType.EmailAddress)]   
    public string Email { get; set; } 

Il semble être une tâche facile en tout remplaçant protected override du DataAnnotationsModelValidatorProvider IEnumerable getValidators (métadonnées ModelMetadata, contexte ControllerContext, les attributs IEnumerable)

Cependant, il semble être assez compliqué.

a. La propriété ErrorMessage de MVC DatannotationsModelValidator est en lecture seule. Donc, je ne peux rien définir ici b. La propriété System.ComponentModel.DataAnnotationErrorMessage (get et set) qui est déjà définie dans MVC DatannotationsModelValidator, donc nous ne pouvons pas définir à nouveau. Si vous essayez de définir vous obtenez "La propriété ne peut pas définir plus d'une fois ..." message d'erreur apparaît.

public class CustomDataAnnotationProvider : DataAnnotationsModelValidatorProvider 
{ 
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes) 
    { 
     IEnumerable<ModelValidator> validators = base.GetValidators(metadata, context, attributes); 

     foreach (ValidationAttribute validator in validators.OfType<ValidationAttribute>()) 
     { 
      messageId = validator.ErrorMessage; 
      validator.ErrorMessage = "Error string from DB And" + messageId ; 
     } 

     //...... 
    } 
} 

Quelqu'un peut-il m'aider s'il vous plaît à ce sujet?

Répondre

2

Voici la question: Quelle est votre motivation pour changer la propriété du message d'erreur? Pensez-y attentivement, alors que vous vous dirigez vers un chemin où vous êtes en train d'obscurcir ce qui se passe réellement dans l'application. Certes, la base de données informatino est utile, mais elle ne fait pas vraiment partie de la validation, et elle ne devrait pas l'être. Lorsque vous vous dirigez dans cette direction, vous dites essentiellement que la validation ne peut être invalide que s'il y a un problème de base de données. Je vois deux problèmes avec cela:

  1. Il brise la séparation des préoccupations. Vous signalez une erreur de persistance dans le modèle, ce qui n'est pas le cas.
  2. La solution ne peut pas être testée par unité car vous devez activer la base de données.

Je n'aime pas l'un ou l'autre de ces deux exemples.

Pouvez-vous résoudre ce problème? Peut-être si vous allez créer votre propre attribut de validation personnalisé. Je devrais vérifier et m'assurer que c'est correct. Une autre option est de viser une validation personnalisée:

http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

Cet article peut également vous aider à la tête dans la direction que vous désirez:

http://ryanrivest.com/blog/archive/2010/01/15/reusable-validation-error-message-resource-strings-for-dataannotations.aspx

Voulez-vous résoudre ce problème? Pas vraiment si vous essayez de garder une séparation appropriée des préoccupations dans votre demande. Je ne poluerais pas mon message d'erreur de validation (ceci n'est pas valide) avec une erreur de base de données (je ne suis pas valide, mais la base de données a également explosé). Juste mes deux cents.

0

Il existe des méthodes intégrées pour obtenir le message d'erreur via une ressource.Au lieu d'une recherche de base de données pour obtenir une ressource à l'exécution, générez des ressources à partir de votre base de données et utilisez-la pour vos messages d'erreur.

Vous pouvez ensuite utiliser ErrorMessageResourceName et ErrorMessageResourceType pour permettre à DataAnnotation d'effectuer une recherche de ressources au lieu de coder en dur une chaîne spécifique.

public sealed class MyModel 
{ 
    [Required(
     ErrorMessageResourceName="MyDescriptionResource", 
     ErrorMessageResourceType=typeof(MyCustomResource))] 
    public string Description { get; set; } 
} 
0

Aussi, vous voudrez peut-être jeter un oeil à ValidationAttribute.FormatErrorMessage Method sur msdn.

Cette méthode formate un message d'erreur en utilisant la propriété ErrorMessageString . Cette méthode ajoute le nom du champ de données qui a déclenché l'erreur au message d'erreur formaté. Vous pouvez personnaliser le formatage du message d'erreur en créant une classe dérivée qui remplace cette méthode .

Un échantillon rapide (et non destiné à être un exemple définitif)

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, 
       Inherited = true)] 
public sealed class PostCodeValidationAttribute 
    : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     if(value == null) 
      return true; 

     string postCode = value as string; 
     if(string.IsNullOrEmpty(postCode)) 
      return true; 

     if (!PostCode.IsValidPostCode(postCode, this.PostCodeStyle)) 
      return false; 

     return true; 
    } 

    public PostCodeStyle PostCodeStyle { get; set; } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(
      "{0} is not a valid postcode for {1}", name, PostCodeStyle); 
    } 
} 

* J'ai omis l'énumération PostCodeStyle ainsi que la classe PostCode pour valider un code postal.

Questions connexes