2010-06-18 4 views
3

Je m'excuse pour la quantité de code que j'ai inclus. J'ai essayé de le garder au minimum. J'essaie d'avoir un attribut de validateur personnalisé sur mon modèle ainsi qu'un classeur de modèle personnalisé. L'attribut et le classeur fonctionnent très bien, mais si j'ai les deux, l'attribut Validation ne fonctionne plus.Attribut de validation personnalisé avec lieur de modèle personnalisé dans MVC 2

Voici mon code découpé pour la lisibilité. Si je ne saisis pas le code dans global.asax, la validation personnalisée se déclenche, mais pas si le classeur personnalisé est activé.

Attribut de validation;

public class IsPhoneNumberAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     //do some checking on 'value' here 
     return true; 
    } 
} 

Utilisation de l'attribut dans mon modèle;

[Required(ErrorMessage = "Please provide a contact number")] 
    [IsPhoneNumberAttribute(ErrorMessage = "Not a valid phone number")] 
    public string Phone { get; set; } 

Modèle personnalisé Binder;

public class CustomContactUsBinder : DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel; 

     if (!String.IsNullOrEmpty(contactFormViewModel.Phone)) 
      if (contactFormViewModel.Phone.Length > 10) 
       bindingContext.ModelState.AddModelError("Phone", "Phone is too long."); 
    } 
} 

Global asax;

System.Web.Mvc.ModelBinders.Binders[typeof(ContactFormViewModel)] = 
    new CustomContactUsBinder(); 
+0

Techniquement, vous ne faites pas vraiment de modèle de liaison avec votre classeur de modèle personnalisé. Ceci est juste en utilisant un modèle de liant pour la validation seulement (ce qui n'est pas ce que les classeurs de modèle sont pour). Si vous avez vraiment besoin d'une validation distincte pour la longueur du numéro de téléphone, cela pourrait également être un attribut. –

+0

@Derek, alors que je suis d'accord avec vous, je l'utilise comme un exemple pour les gars ici sur ce qui est possible. J'ai le code de liaison propper là aussi et ce que j'ai présenté ici est un extrait seulement – griegs

Répondre

5

Assurez-vous que vous appelez la méthode base:

protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel; 

    if (!String.IsNullOrEmpty(contactFormViewModel.Phone)) 
     if (contactFormViewModel.Phone.Length > 10) 
      bindingContext.ModelState.AddModelError("Phone", "Phone is too long."); 

    base.OnModelUpdated(controllerContext, bindingContext); 
} 
+0

AAAahhhh! Juste vérifié SVN. Je l'ai enlevé ce matin pour une raison stupide et oublié à ce sujet! Merci @Darin. – griegs

Questions connexes