Atributo de validação personalizada com fichário de modelo personalizado no MVC 2
-
28-09-2019 - |
Pergunta
Peço desculpas pela quantidade de código que incluí. Eu tentei mantê -lo no mínimo.
Estou tentando ter um atributo de validador personalizado no meu modelo, bem como um fichário personalizado. O atributo e o fichário funcionam muito bem, mas se eu tiver os dois, o atributo de validação não funciona mais.
Aqui está o meu código para legibilidade. Se eu deixar de fora o código no Global.asax, os incêndios de validação personalizados, mas não se eu tiver o fichário personalizado ativado.
Atributo de validação;
public class IsPhoneNumberAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
//do some checking on 'value' here
return true;
}
}
Uso do atributo no meu modelo;
[Required(ErrorMessage = "Please provide a contact number")]
[IsPhoneNumberAttribute(ErrorMessage = "Not a valid phone number")]
public string Phone { get; set; }
Fichário de modelo personalizado;
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 global;
System.Web.Mvc.ModelBinders.Binders[typeof(ContactFormViewModel)] =
new CustomContactUsBinder();
Solução
Certifique -se de estar ligando para o base
método:
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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow