2017-07-26 35 views
0

私はASP.NET MVC Webサービスを開発中です。 Webページでは、ユーザーがボタンをクリックすると、複雑なメソッドがトリガーされ、完了までに少し時間がかかります。ユーザーを待機中のページにリダイレクトしてから、プロセスが終了したらユーザーを新しいページにリダイレクトします。イベントを使用してASP.NET MVCでActionResultをトリガーする

処理が完了すると、コントローラから聴くことができるイベントが発生します。しかし、私は最後の一歩を踏み出すことができません(コントローラーはイベントを受け取ったときに新しいページにリダイレクトされます)。

public MyController() 
    { 
     EventsControllerClass.ProcessComplete += new EventHandler<MyArgsClass>(OnEventReceived); 
    } 

    private void OnEventReceived(object sender, MyArgsClass eventArguments) 
    { 
     RedirectToPage(); 
    } 

    private ActionResult RedirectToPage() 
    { 
     return RedirectToAction("PageName"); 
    } 
+0

同期を実装する必要があります。 –

+0

ありがとう、私はそれを調べようとします! – Pablo

答えて

0

多くの日がこれに働いた後、私は実行可能な解決策を持っている:

は、ここで(単純な名前で)それをやっての私の非常にナイーブ試みです。それはきれいではないかもしれませんが、それはうまくいくかもしれませんし、他の人にとって役に立つアイデアかもしれないので、ここでそれがあります:

私はこの問題を解決する方法を説明します:より長いプロセスがバックグラウンドで実行され、終了時にイベントが発生します。このイベントが受信されると、ユーザーを(自動的に)最終ページにリダイレクトする必要があります。

まず、イベントを聴くためのクラスを作成しました。私はコントローラでこれを直接実行しようとしましたが、署名と署名の解除に注意する必要があります。なぜなら、コントローラは要求ごとに作成され破棄されるためです。この "リスナークラス"には、イベントが受信されたときに "true"に設定されたboolプロパティがあります。

最初のアクションがトリガされると、コントローラは、通常、私は新しいアクションへのリダイレクトこの単純なJavaスクリプトを持っている「待機」ページにリダイレクトします。これは、(運動に長いプロセスを設定します

<script type="text/javascript"> 
    window.location = "@Url.Action("WaitThenRedirect", "AuxiliaryControllerName")"; 
</script> 

別のイベントを通じて)。キーは、非同期アクションでこれを行うことです(このコントローラーはAsyncControllerから継承します)。私は他のソリューションのためのAjax構文を使用することが可能であると考えてい

public static event EventHandler<AuxiliaryEventsArgs> ProcessReady; 

public void WaitThenRedirectAsync() 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    ProcessReady += (sender, e) => 
    { 
     AsyncManager.Parameters["success"] = e.success; 
     AsyncManager.OutstandingOperations.Decrement(); 
    }; 
    WaitForEvent(); 
} 

public ActionResult WaitThenRedirectCompleted(bool success) 
{ 
    if (success) 
    { 
     return RedirectToAction("RedirectToView", "ControllerName"); 
    } 
    else 
    { 
     return RedirectToAction("UnexpectedError", "ControllerName"); 
    } 
} 

private void WaitForEvent() 
{ 
    bool isWaitSuccessful = true; 
    int waitingLoops = 0; 
    int waitingThreshold = 200; 
    int sleepPeriod = 100; // (milliseconds) 
    while (!EventsListener.IsTheThingReady()) 
    { 
     System.Threading.Thread.Sleep(sleepPeriod); 
     ++waitingLoops; 
     if (waitingLoops > waitingThreshold) 
     { 
      System.Diagnostics.Debug.WriteLine("Waiting timed out!"); 
      isWaitSuccessful = false; 
      break; 
     } 
    } 
    isWaitSuccessful = true; 

    if (null != ProcessReady) 
    { 
     AuxiliaryEventsArgs arguments = new AuxiliaryEventsArgs(); 
     arguments.success = isWaitSuccessful; 
     try 
     { 
      ProcessReady(null, arguments); 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine("Error in event ProcessReady" + ex); 
     } 
    } 
} 

を、これは次のようになります。これは、これがどのように見えるかである(more info hereを)(。。これは離れて、すべての非同期のものを維持することです、私は補助コントローラを使用します)私が持っているものはうまく動作します。私はこれが非常に一般的な必要ではないと信じていますが、うまくいけば誰かが恩恵を受けるだろ

関連する問題