2013-05-29 14 views
14

Ho un hook di API web pre-azione che controllerà ModelState.IsValid. Se ModelState non è valido, non voglio eseguire l'azione e restituire immediatamente il mio messaggio. Come esattamente faccio questo?Web Api - come interrompere la pipeline Web direttamente da un filtro OnActionExecuting

public class ValidateModelStateAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) { 
     if (!actionContext.ModelState.IsValid) 
     { 
      var msg = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState); 
      // Now What? 
     } 
     base.OnActionExecuting(actionContext); 
    } 
} 

risposta

28

impostare il Response.Result. Se il risultato non è nullo, non eseguirà l'azione. la sintassi esatta mi sta sfuggendo in questo momento, ma è semplice come

if(actionContext.ModelState.IsValid == false) 
{ 
     var response = actionContext.Request.CreateErrorResponse(...); 
     actionContext.Response = response; 
} 
+0

Vedo, quindi chiamo la base o no? Quello che vorrei davvero è che tutti i filtri pre-azione vengano eseguiti, ma non l'azione stessa. In questo modo i filtri di registrazione continuerebbero comunque a funzionare –

+0

sì, puoi chiamare 'base' –

2

La mia ipotesi è che si dovrebbe gettare un HttpResponseException

+0

Si pensi che funzionerebbe allo stesso modo del semplice ritorno del messaggio? Non in uno stato di compilazione, quindi non posso controllare atm ma mi sembra strano gettare eccezioni per problemi di validazione. –

+0

@GeorgeMauer Funzionerà per ActionFilters, non è sicuro su AuthorizationFilters. Come ha detto Joanna a quanto pare puoi anche solo impostare la risposta. Wow, odio davvero ActionFilters, tanta complessità senza motivo. –

+0

Cosa intendi? In quale altro modo si fanno preoccupazioni trasversali? Usare le classi base per questo in genere si trasforma in un enorme pasticcio inflessibile una volta che si hanno abbastanza preoccupazioni trasversali. L'unica altra opzione finisce per essere qualcosa come PostSharp che ha una propria serie di problemi. –

7

Avete effettivamente visto l'esempio nella pagina ASP.NET WebAPI?

è molto simile a quello che si sta cercando di raggiungere e tutto quello che fanno è l'impostazione della risposta dell'oggetto Context:

If model validation fails, this filter returns an HTTP response that contains the validation errors. In that case, the controller action is not invoked.

http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

vedi: Handling Validation Errors

+0

ah, no non l'avevo visto. Grazie. –