2012-01-25 15 views
1

ASP.Net MVC 3アプリケーションでエラー処理方法を実装しています。私はIExceptionFilterなどを実装する属性を記述しました。これは正しく機能し、例外を処理するとactionメソッドをスローし、JSONとして直列化された例外情報を返します。ASP.NET MVC 3からのUpdateModelの動作を強制するアクションメソッドパラメータのデフォルトモデルバインダー

この属性を使用して、データをアクションメソッドに渡すときにモデルバインダーで検出された検証エラーも処理したいと考えています。たとえば、ActionメソッドのパラメータとしてデシリアライズされたActionメソッドにオブジェクトをPOSTすると、UpdateModelのように検証エラーが発生した場合に例外がスローされます。現在のデフォルトのモデルバインダーは、TryUpdateModelのように動作するように見えますが、例外をスローするのではなくModelState.IsValidを反転するだけです。

[ActionExceptionJsonHandler] 
public ActionResult CreateSomething(SomethingViewData account) 
{ 
// If model binding fails validation an exception should be thrown and no code is executed here 
// Do stuff here 
} 

のUpdateModelが、その後IExceptionFilterはそれをキャッチして、クライアントに検証エラーを返す扱うでしょうないように、デフォルトのモデルバインダーは、同じように例外をスローした場合。それがなければ、開発者はにModelStateをチェックするコードを記述しなければならないなど

私は2つの関連の質問があるので、一番下の行:

  1. は、検証が失敗したときに、デフォルトのモデルバインダーが例外をスロー持つ方法はありますか?
  2. このアプローチを使用することについての考えと、各アクションメソッドでModelStateを手動でチェックすることについての考えはありますか?

ありがとうございます。

答えて

0

私のソリューションは以下のようにActionFilterAttributeを実装することになりました。 OnActionExecutingではModelState.IsValidをチェックし、falseの場合はモデル状態エラーをJSONとしてシリアル化し、結果オブジェクトを効果的にキャンセルして実行をキャンセルします。これにより、モデルバインディングエラーを含むカスタムJSON直列化オブジェクトを返すことができます。

public override void OnActionExecuting(ActionExecutingContext filterContext) { 

     if (filterContext.Controller.ViewData.ModelState.IsValid) { 
      base.OnActionExecuting(filterContext); 
      return; 
     } 

     var returnDto = new ReturnDto 
          { 
           Success = false, 
           Errors = Tools.GetModelStateErrors(filterContext.Controller.ViewData.ModelState) 
          }; 

     // AllowGet is fine provided we are not returning a javascript array 
     filterContext.Result = new JsonResult { Data = returnDto, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
    } 
関連する問題