2013-05-29 21 views
14

我有一個將執行ModelState.IsValid的動作前web api鉤子。如果ModelState無效,我不想執行該操作並立即返回我的消息。我到底該怎麼做?Web Api - 如何從OnActionExecuting過濾器直接停止Web管道

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

回答

28

設置Response.Result。如果結果不爲空,則不執行該操作。確切的語法現在正在逃避我,但它很簡單

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

我明白了,然後我打電話給基地嗎?我真正想要的是所有預執行過濾器都可以運行,而不是操作本身。這樣,任何日誌記錄過濾器仍然會運行 –

+0

是的,你可以調用'base' –

2

我的猜測是,你應該拋出一個HttpResponseException

+0

你認爲那隻會返回消息而起作用?不處於編譯狀態,所以我無法檢查atm,但爲驗證問題拋出異常似乎很奇怪。 –

+0

@GeorgeMauer它將用於ActionFilters,不確定AuthorizationFilters。正如喬安娜顯然提到的,你也可以設置響應。哇,我真的很討厭ActionFilters,沒有理由太複雜了。 –

+0

你是什麼意思?你還怎麼做跨領域的關注?一旦你得到了足夠的交叉問題,使用基類就會變成一個巨大的不靈活的混亂。唯一的其他選擇就是像PostSharp這樣的問題,它有自己的問題。 –

7

你真的看到了ASP.NET WebApi頁面上的例子嗎?

看起來非常像你想實現什麼,他們做的是設置上下文對象的響應:

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

見:Handling Validation Errors

+0

啊,不,我沒有看到這個。謝謝。 –