0

ページに操作があり、3 つの長い操作 (それぞれ数秒) を連続して実行する必要があります。ただし、各操作が実行された後、コントローラーが部分的なビューを返し、ページがステータスで更新されるようにしたいと思います (ユーザーに情報を提供し続けます。人々が何かが起こっていることを知っていれば、心配は減ります)。これを行うMVCの「方法」はありますか、それともjQueryを使用するだけですか?

ありがとう。

4

5 に答える 5

0

jQuery を使用して、3 つの個別のコントロール メソッドに対して 3 つの個別の呼び出しを発行し、戻ったときにページの 3 つの領域を個別に更新します。

呼び出しを「束ねる」唯一の方法は、すべてを 1 つに結合することですが、複数の呼び出しが返されたときに戻り値をクライアントに返すことはできません (ストリーミングのように、クライアント側でリッスンするものは何もありません)。最初の結果セットを返すと、その接続は閉じられます)。

于 2010-03-01T17:46:45.163 に答える
0

「不器用な」ソリューションが機能する理由は、setTimeout()メソッドがイベントを作成するためです。したがって、あなたのロジックは次のとおりです。

  1. UI の更新
  2. ステップ 1 のセットアップ イベント:
    1. 「ajax」呼び出しを開始
    2. 「ajax」が終了するのを待ちます
    3. ステップ 2 のセットアップ イベント
      1. 「ajax」呼び出しを開始
      2. 「ajax」が終了するのを待ちます
      3. ステップ 3 のセットアップ イベント
        1. 「ajax」呼び出しを開始

これはまさに のコールバック機能のajax()目的です。

function Step1() {
    $.ajax({ 
        type: "GET", 
        dataType: "json", 
        url: "/ControllerName/Action1", 
        success: function(msg) { 
            updateUI(msg);
            Step2(); // call step 2 here!
        }, 
        async: true, // don't block the UI
        error: function(XMLHttpRequest, textStatus, errorThrown) { 
            updateUI("Action1 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); 
        } 
    });
}
function Step2() {
    // similar to step one
}
于 2010-03-01T23:47:09.037 に答える
0

私たちのサイトでは、時間がかかる大きなアクションがあります。そのアクションはサブアクションによって構成され、結果を集約して、適切なビューを構築します。

1年前:

  • これを順番に実行していました: アクション 1、アクション 2 など。
  • その典型的なページがありました:しばらくお待ちください。

あなたを助けることができるトリック:

  • サーバー側で並列リクエストを行います。
  • 結果ページで結果を待ちます。そこにある JavaScript はロードするのに時間がかかるため、サーバーが検索している間にページをロードします。
  • 私たちは毎秒サーバーに尋ねます: 終了しましたか? そして、さまざまなアクションが完了すると、部分的な結果が得られます。

これらすべてを問題に適用できるかどうかはわかりませんが、そのうちのいくつかは本当に素晴らしいものです。

MVC は使用せず、jQuery と ajax でいくつかの asmx サービスを使用します。

于 2010-08-24T13:03:40.007 に答える
0

だから私はちょっとしたハックを作成しました、それはうまくいくようです:

クライアント側には次のものがあります。

function onClickHandler() {
    updateUI("Beginning Batch...");
    setTimeout(klugeyClick, 0);
}

function klugeyClick() {
    $.ajax({ type: "GET", dataType: "json", url: "/ControllerName/Action1", success: function(msg) { updateUI(msg) }, async: false, error: function(XMLHttpRequest, textStatus, errorThrown) { updateUI("Action1 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); } });
    setTimeout(klugeyClick2, 0);
}

function klugeyClick2() {
    $.ajax({ type: "GET", dataType: "json", url: "/ControllerName/Action2", success: function(msg) { updateUI(msg) }, async: false, error: function(XMLHttpRequest, textStatus, errorThrown) { updateUI("Action2 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); } });
    setTimeout(klugeyClick3, 0);
}

function klugeyClick3() {
    $.ajax({ type: "GET", dataType: "json", url: "/ControllerName/Action3", success: function(msg) { updateUI(msg) }, async: false, error: function(XMLHttpRequest, textStatus, errorThrown) { updateUI("Action3 Error: " + XMLHttpRequest + " -- " + textStatus + " ---- " + errorThrown); } });
}

function updateUI(result) {
    $("#UIelement").text(result);
}

サーバー側には次のものがあります。

Function Action1() As JsonResult
    System.Threading.Thread.Sleep(3000)
    Return Json("Operation One Complete...")
End Function

Function Action2() As JsonResult
    System.Threading.Thread.Sleep(3000)
    Return Json("Operation Two Complete...")
End Function

Function Action3() As JsonResult
    System.Threading.Thread.Sleep(3000)
    Return Json("Operation Three Complete...")
End Function

今、私には2つの問題があります。まず、「バッチ完了」を表示するフォローアップ メッセージが必要ですが、同じパターンに従い、UpdateUI への呼び出し (seTimeout の有無にかかわらず) で別の「klugeyClick」を追加するだけで、最後の操作メッセージが表示されません。 . jQuery.ajax メソッド内のコールバックにより、このクルージが何らかの形で機能すると思いますが、ajax 呼び出しがないと、フォローアップ メッセージを送信できません。

次の問題は、すべての呼び出しが Web サービスに到達し、json の結果を正常に返しているにもかかわらず、jQuery コールバックから常にエラーが返されることです。なぜこれが考えられるのでしょうか?

ありがとう。

于 2010-03-01T23:26:58.883 に答える