ページに操作があり、3 つの長い操作 (それぞれ数秒) を連続して実行する必要があります。ただし、各操作が実行された後、コントローラーが部分的なビューを返し、ページがステータスで更新されるようにしたいと思います (ユーザーに情報を提供し続けます。人々が何かが起こっていることを知っていれば、心配は減ります)。これを行うMVCの「方法」はありますか、それともjQueryを使用するだけですか?
ありがとう。
ページに操作があり、3 つの長い操作 (それぞれ数秒) を連続して実行する必要があります。ただし、各操作が実行された後、コントローラーが部分的なビューを返し、ページがステータスで更新されるようにしたいと思います (ユーザーに情報を提供し続けます。人々が何かが起こっていることを知っていれば、心配は減ります)。これを行うMVCの「方法」はありますか、それともjQueryを使用するだけですか?
ありがとう。
jQuery を使用して、3 つの個別のコントロール メソッドに対して 3 つの個別の呼び出しを発行し、戻ったときにページの 3 つの領域を個別に更新します。
呼び出しを「束ねる」唯一の方法は、すべてを 1 つに結合することですが、複数の呼び出しが返されたときに戻り値をクライアントに返すことはできません (ストリーミングのように、クライアント側でリッスンするものは何もありません)。最初の結果セットを返すと、その接続は閉じられます)。
「不器用な」ソリューションが機能する理由は、setTimeout()
メソッドがイベントを作成するためです。したがって、あなたのロジックは次のとおりです。
これはまさに のコールバック機能の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
}
私たちのサイトでは、時間がかかる大きなアクションがあります。そのアクションはサブアクションによって構成され、結果を集約して、適切なビューを構築します。
1年前:
あなたを助けることができるトリック:
これらすべてを問題に適用できるかどうかはわかりませんが、そのうちのいくつかは本当に素晴らしいものです。
MVC は使用せず、jQuery と ajax でいくつかの asmx サービスを使用します。
だから私はちょっとしたハックを作成しました、それはうまくいくようです:
クライアント側には次のものがあります。
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 コールバックから常にエラーが返されることです。なぜこれが考えられるのでしょうか?
ありがとう。