2011-11-17 14 views
7

Estoy desarrollando una API REST usando controladores MVC. Me gustaría manejar todos los errores de encuadernación del modelo y reportarlos al cliente de una manera fácil de usar. En mis carpetas de modelo personalizado ya estoy lanzando una excepción especial que el manejador de excepciones considera segura y que se muestra al cliente.Maneje de manera confiable los errores de vinculación del modelo ASP.NET MVC

Sin embargo, cuando el aglutinante modelo por defecto ve un valor no válido (por ejemplo, asdf para una int) que parece ignorar por completo (si no es necesario el parámetro) o lanzar una llanura ArgumentException (si el parámetro es necesario). ¿Es posible manejar de manera confiable ambos casos y obtener el nombre del parámetro y el error relacionado, sin reescribir todo el enlace a mano?

Prefiero no mostrar el ArgumentException como está porque revela métodos y nombres de espacios de nombres que el cliente no debería tener que importar. También preferiría no analizar el mensaje ArgumentException si es evitable, y eso no resolvería el problema con los valores no válidos para los parámetros no requeridos que se ignoran por completo.

+0

¿Alguna vez encontró una buena solución? Estoy pensando en decorar o subclasificar el 'IModelBinder', pero me gustaría saber si hay una mejor manera. –

+0

@FabianSchmied: Desafortunadamente no. El encuadernador de "Web API" probablemente tenga una mejor compatibilidad con este caso, y no conozco ASP.NET Core. –

Respuesta

3

Puede implementar la interfaz IValidatableObject en su modelo. Allí puede crear su propia lógica de validación, reemplazando la validación de atributo Required que tiene actualmente.

public class Model : IValidatableObject { 
    public int MyIntProperty { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
     if (MyIntProperty == 0) { 
      yield return new ValidationResult("Please provide a valid value for MyIntProperty.", new[] { "MyIntProperty" }); 
     } 
    } 
} 

En el controlador se puede inspeccionar la colección ModelState.Errors para ver los errores de validación. Además, esto generará la clase CSS de error en el lado del cliente siempre que esté utilizando una vista fuertemente tipada y los ayudantes de formulario HTML.

Cuestiones relacionadas