2011-11-17 19 views
7

Sto sviluppando un'API REST utilizzando i controller MVC. Mi piacerebbe gestire tutti gli errori di binding del modello e segnalarli al client in modo user-friendly. Nei miei raccoglitori modello personalizzati sto già generando un'eccezione speciale considerata sicura dal gestore delle eccezioni e mostrata al client.Gestire in modo affidabile errori di associazione modello ASP.NET MVC

Tuttavia, quando il legante modello predefinito vede un valore non valido (ad esempio, asdf per un int) sembra sia completamente ignorarlo (se il parametro non è necessario) o lanciare una pianura ArgumentException (se il parametro è obbligatorio). È possibile gestire in modo affidabile entrambi i casi e ottenere il nome del parametro e l'errore correlato, senza riscrivere l'intero raccoglitore a mano?

Preferisco non mostrare il ArgumentException come è perché rivela metodi e nomi dei nomi che il client non dovrebbe preoccuparsi. Preferisco anche non analizzare il messaggio ArgumentException se è evitabile, e che non risolverebbe il problema con valori non validi per i parametri non richiesti che vengono ignorati completamente.

+0

Hai mai trovato una buona soluzione? Sto pensando di decorare o sottoclasse l'IModelBinder, ma mi piacerebbe sapere se c'è un modo migliore. –

+0

@FabianSchmied: Purtroppo no. Probabilmente il legatore del modello "Web API" ha un supporto migliore per questo caso - e non so su ASP.NET Core. –

risposta

3

È possibile implementare l'interfaccia IValidatableObject sul modello. Qui è possibile creare la propria logica di convalida, sostituendo la convalida dell'attributo Required attualmente in uso.

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" }); 
     } 
    } 
} 

nel controller è possibile ispezionare la collezione ModelState.Errors per vedere gli errori di validazione. Inoltre, questo genererà l'errore della classe CSS sul lato client, a condizione che si stia utilizzando una vista fortemente tipizzata e gli helper del modulo HTML.

Problemi correlati