2013-05-29 10 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を設定HttpResponseExceptionを投げるべきであるということです。結果がnullでない場合、アクションは実行されません。正確な構文は今すぐ私をエスケープしていますが、それは簡単です

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

私は参照してください、私はその後、ベースを呼び出すかどうか?私が本当に望むのは、すべてのプリアクションフィルタが動作するだけで、アクション自体は実行されないということです。そのようにすれば、どのロギングフィルタもまだ実行されます。 –

+0

はい、 'base'を呼び出すことができます –

2

私の推測では、あなたが

+0

あなたが考えますメッセージを返すだけで同じことができますか?コンパイル状態ではないので、atmをチェックすることはできませんが、バリデーションの問題の例外をスローするのは奇妙です。 –

+0

@GeorgeMauer ActionFiltersでは動作しますが、AuthorizationFiltersについてはわかりません。ジョアンナが明らかに言ったように、レスポンスを設定することもできます。うわー、私はActionFiltersを本当に嫌い、何の理由もありません。 –

+0

どういう意味ですか?クロスカッティングに関する懸念を他にどのようにしていますか?ベースクラスを使用すると、クロスカッティングに関する十分な懸念が得られれば、大まかに柔軟性がなくなります。他の唯一のオプションは、独自の問題のホストを持つPostSharpのようなものになります。 –

7

実際にASP.NET WebApiページの例を見ましたか?

は非常にあなたが達成しようとしていると、彼らはすべての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

は、以下を参照してください。Handling Validation Errors

+0

ああ、私はこれを見ていませんでした。ありがとう。 –

関連する問題