2009-08-09 22 views
1

長時間実行される非同期タスクを起動する前に、フォームの入力を確認できます。気になるASP.net MVC先物AsyncController:サーバーの有効性の処理

二つのアプローチ:beginメソッドと 上

  1. チェック値は、例外をスロー?
  2. ノーマル(同期法)に転記すると、通常通りに確認されます。エラーが見つからなければasynchonrousメソッドにリダイレクトします。

例外をスローすると、簡単な解決策になると思います。 beginメソッドからビューを返すことができないため、endメソッドで例外が処理されます。 (通常のパターンだと思ったのですが)

通常の同期メソッドでの検証はうまくいきます...しかし、どのようにしてリクエストを非同期メソッドにリダイレクトするのですか? ?

+0

はあなたが使用しているどの非同期的なアプローチを明確することができ:

ここでは、エラー(この場合は、無効なID)があるかどう返すようにダミーのデリゲートを使用します。ここで、この単純な例ですか? (つまり、IAsyncResultパターン、イベントパターンまたはデリゲートパターン)。詳細はこちらをご覧ください:http://blog.maartenballiauw.be/post/2009/04/08/Using-the-ASPNET-MVC-Futures-AsyncController.aspx –

+0

なぜあなたは例外を介していますか?あなたはこれを読んでいる:http://stackoverflow.com/questions/77127/when-to-throw-an-exception –

答えて

1

例外や同期メソッドを使用する必要はありません。別のIAsyncResultを返すことができます(使用しているパターンを前提としています)。イベントやデリゲートパターンを使用している場合は、例外なしに何か類似したものを達成することができます)。

public class MyAsyncController : AsyncController 
{ 
    public IAsyncResult BeginFoo(int id, AsyncCallback callback, object state) 
    { 
     Action errorDelegate =() => ViewData["errors"] = "Invalid ID"; 
     // Here's our validation check, return the error delegate if necessary 
     if (id <= 0) return errorDelegate.BeginInvoke(callback, state); 

     var webRequest = WebRequest.Create("http://www.apple.com"); 
     return webRequest.BeginGetResponse(callback, webRequest); 
    } 

    public ActionResult EndFoo(IAsyncResult asyncResult) 
    { 
     if (asyncResult.AsyncState is WebRequest) 
     { 
      var webRequest = (WebRequest) asyncResult.AsyncState; 
      var httpResponse = (HttpWebResponse) webRequest.EndGetResponse(asyncResult); 
      ViewData["status"] = httpResponse.StatusCode; 
     } 
     return View(); 
    } 
} 
関連する問題