5

He configurado un proveedor personalizado para permitir la configuración de los atributos de validación de un almacén de datos en lugar de en el código estático. Funciona muy bien con la validación del lado del cliente en mi proyecto .NET MVC 4, pero no puedo hacer que la validación del lado del servidor funcione.Validación del lado del servidor con Custom DataAnnotationsModelValidatorProvider

.cs CustomModelValidatorProvider:

 

    public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider 
    { 
     protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes) 
     { 
      // set attributes from datastore here 

      return base.GetValidators(metadata, context, attributes); 
     } 
    } 

En mis Global.asax.cs tengo:

 

    protected void Application_Start() 
    { 
     ModelValidatorProviders.Providers.Clear(); 
     ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider()); 
    } 

Y en un método de API Web que tengo:

 

    var validationResultList = new List(); 
    bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true); 

Aquí, válido es siempre cierto. Incluso cuando la validación del lado del cliente de Jquery muestra un error. En el lado del servidor, mi proveedor personalizado no se usa para aplicar las anotaciones de datos. Cuando establezco un punto de interrupción en GetValidators() se llama cuando se crea la vista y muestra correctamente los validadores del lado del cliente, pero no se vuelve a llamar cuando el modelo está vinculado al controlador.

¿He perdido un paso? ¡Cualquier ayuda es muy apreciada!

ACTUALIZACIÓN

El validador personalizado funciona correctamente cuando el objeto está afectado a un controlador, pero no son despedidos cuando sea publicado en un ApiController.

+0

lo siento, ¡publiqué un comentario en la otra pregunta sin darme cuenta de que esta era su pregunta! Por lo que sé, los controladores API y los controladores estándar utilizan carpetas de modelo separadas, por lo que el problema podría deberse a que el validador no se haya agregado correctamente al encuadernador de modelo correcto. Actualmente no en mi PC, pero voy a echarle un vistazo más tarde :) – Henry

+0

@HenryGarle Sí, acabo de probar esto y la validación personalizada funciona cuando se publica en un controlador, pero no en el ApiController. No estoy seguro de cómo registrarlo correctamente para el ApiController. – Dave

+0

Ok, eso es un buen comienzo, ¿la herencia de ModelValidatorProvider hace una diferencia? – Henry

Respuesta

3

Finalmente me di cuenta de esto, es una respuesta bastante simple. Los ApiControllers solo responden a los proveedores en el espacio de nombres System.Web.Http.Validation, no en el espacio de nombres System.Web.Mvc que se utiliza para los Controladores regulares y la validación del lado del cliente.

Implementé ambos para lograr la validación del lado del cliente y la validación del servidor en los ApiControllers.

Cuestiones relacionadas