0

我在我的页面上有一个操作,然后需要连续执行 3 个长(每个几秒)操作。但是,在执行每个操作之后,我希望控制器返回一个局部视图并使用状态更新页面(让用户了解情况,我发现如果人们知道这些事情正在发生,他们就会减少担心)。有没有一种 MVC 的“方式”来做到这一点,或者我应该只使用 jQuery 来做到这一点?

谢谢。

4

5 回答 5

0

您将希望使用 jQuery 对三个单独的控制方法发出三个单独的调用,并在返回时分别更新页面的三个区域。

“捆绑”调用的唯一方法是将所有调用合并为一个,但是当返回多个调用时,您无法将返回值返回给客户端(几乎就像流式传输一样,客户端上没有任何监听返回第一个结果集后,该连接将关闭)。

于 2010-03-01T17:46:45.163 回答
0

对于我们的网站,我们有一个需要一些时间的动作。该动作由子动作组成,我们汇总结果并构建一个漂亮的视图。

一年前:

  • 我们按顺序执行此操作:action1,然后是 action2,等等。
  • 我们有典型的页面:请稍候。

可以帮助您的技巧:

  • 我们在服务器端执行并行请求。
  • 我们在结果页面中等待结果。那里的 javascript 需要一些时间来加载,所以当服务器搜索时,我们会加载页面。
  • 我们每秒都在询问服务器:你完成了吗?随着不同动作的完成,我们得到了部分结果。

我不知道你是否可以将所有这些东西都应用到你的问题上,但其中一些真的很好。

我们不使用 MVC,我们使用一些带有 jQ​​uery 和 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

现在我有两个问题。首先,我想要一条显示“批处理完成”但遵循相同模式的后续消息,并且只需添加另一个“klugeyClick”并调用 UpdateUI(带或不带 seTimeout)会导致最后的操作消息不显示. 我认为 jQuery.ajax 方法中的回调使这个 kluge 以某种方式工作,但没有 ajax 调用,我无法放置任何后续消息。

下一个问题是,尽管我所有的调用都到达了我的 web 服务并且返回 json 结果很好,但我总是从 jQuery 回调中得到一个错误。任何想法为什么会这样?

谢谢。

于 2010-03-01T23:26:58.883 回答
0

您的“kludgy”解决方案有效的原因是该setTimeout()方法创建了一个事件。因此,您的逻辑是:

  1. 更新用户界面
  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

据我所知,让后续消息以我想要的方式出现的唯一方法(即在我最后一次操作后几秒钟)是有一个我调用的返回最后一条消息的虚拟 web 服务方法延迟后... 易碎。

现在我的最后一个问题是,我对 jsonResult 操作的所有调用都返回给客户端的 textStatus 为“错误”。现在根据文档,这意味着一个 http 错误,但是如果在服务器端正确调用了该方法并且生成了 Json 结果(通过在服务器上设置断点进行验证),怎么会出现 http 错误?

于 2010-03-02T01:05:13.590 回答