Attributo di convalida personalizzato con modello Binder in MVC 2
-
28-09-2019 - |
Domanda
Mi scuso per la quantità di codice ho incluso. Ho cercato di tenerlo al minimo.
Sto cercando di avere un attributo personalizzato Validator sul mio modello, così come legante personalizzato modello. L'attributo e il lavoro grande Binder separatamente, ma se ho sia, l'attributo di convalida non funziona più.
Ecco il mio codice stato tagliato per migliorare la leggibilità. Se lascio il codice in Global.asax i fuochi di validazione personalizzati, ma non se ho il legante personalizzato abilitato.
Attributo di convalida;
public class IsPhoneNumberAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
//do some checking on 'value' here
return true;
}
}
Usage dell'attributo nel mio modello;
[Required(ErrorMessage = "Please provide a contact number")]
[IsPhoneNumberAttribute(ErrorMessage = "Not a valid phone number")]
public string Phone { get; set; }
Custom modello 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.");
}
}
ASax globale;
System.Web.Mvc.ModelBinders.Binders[typeof(ContactFormViewModel)] =
new CustomContactUsBinder();
Soluzione
Assicurarsi che si sta chiamando il metodo 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow