Question

Je présente mes excuses pour la quantité de code que j'ai inclus. J'ai essayé de le garder à un minimum.

Je suis en train d'avoir un attribut personnalisé validateur sur mon modèle ainsi qu'un liant modèle personnalisé. L'attribut et le travail liant grand séparement mais si j'ai à la fois, l'attribut de validation ne fonctionne plus.

Voici mon code snipped pour une meilleure lisibilité. Si je laisse le code dans Global.asax les feux de validation personnalisé, mais pas si je le liant personnalisé activé.

Validation attribut;

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

useage 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é liant;

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.");
    }
}

asax mondial;

System.Web.Mvc.ModelBinders.Binders[typeof(ContactFormViewModel)] = 
  new CustomContactUsBinder();
Était-ce utile?

La solution

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top