Pregunta

Me disculpo por la cantidad de código que he incluido. He tratado de mantenerlo al mínimo.

Estoy tratando de tener un atributo validador propio en mi modelo, así como un aglutinante modelo personalizado. El atributo y el gran trabajo Carpeta por separado pero si tengo tanto, el atributo de validación ya no funciona.

Aquí está mi código cortado con tijeras para facilitar la lectura. Si dejo el código en Global.asax los fuegos de validación personalizada pero no si ha activado la carpeta de encargo.

Validación Attribute;

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

Useage del atributo en mi modelo;

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

Modelo carpeta de encargo;

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 Mundial;

System.Web.Mvc.ModelBinders.Binders[typeof(ContactFormViewModel)] = 
  new CustomContactUsBinder();
¿Fue útil?

Solución

Asegúrese de que está llamando el método 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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top