5

Ho un modello di vista che implementa IValidatableObject e ha anche diversi attributi di validazione. Quando tento di chiamare un'azione sul mio ApiController, viene eseguita solo la convalida dell'attributo. L'API Web ASP.NET non supporta IValidatableObject? Qual è l'alternativa per la convalida complessa che non può essere rappresentata da un singolo attributo?L'API Web ASP.NET supporta IValidatableObject?

Modifica: Da qualche parte lungo la linea, devo aver aggiustato qualcosa. La convalida ha iniziato misteriosamente a funzionare come previsto. Sembra che IValidatableObject sia sicuramente supportato di default.

risposta

1

Non ancora provato IValidatableObject su webapi, ma dovrebbe essere supportato in base alla documentazione il provider di convalida per DataAnnotations (DataAnnotationsModelValidatorProvider) fornisce anche convalida IValidatableObject. Vedi qui: http://msdn.microsoft.com/en-us/library/system.web.http.validation.providers(v=vs.108)

In ogni caso, è possibile utilizzare anche il livello dell'oggetto ValidationAttribute che è possibile utilizzare per decorare una classe ... Non è così facile come IValidatableObject, ma dovrebbe funzionare.

0

A partire da ora, è supportato IValidatableObject.

4

Con Web API 2.1 (Microsoft.AspNet.WebApi nuget 5.1.x), ho riscontrato che il metodo Validate di validalidObject non viene chiamato se uno degli attributi di convalida non è valido. Pertanto, tutti gli attributi di convalida applicati alle proprietà della classe devono prima passare come validi prima che venga chiamato il metodo Validate della classe.

Se, ad esempio, si dispone di una proprietà con RequiredAttribute e non si inserisce un valore in tale campo, l'implementazione del metodo Validate di IValidatableObject non verrà chiamata. Sebbene non sia tecnicamente un bug, mi aspettavo che il metodo Validate venisse chiamato ogni volta che convalidassi.

+0

Penso che intendi WebAPI 2? Che di solito è confezionato con MVC 5. In entrambi i casi, ciò che hai vissuto è il comportamento previsto. Ho usato dotPeek per verificare questo comportamento. C'è un'istruzione if in qualche parte in una delle classi. Super odioso. –

+0

Hai ragione, mi riferivo all'API Web 2, ma mi riferivo alla versione del pacchetto nuget. Ho chiarito quella parte della mia risposta. Grazie per il feedback. –