【问题标题】:Return ajax updates from asp.net mvc5 action method before returning View在返回视图之前从 asp.net mvc5 操作方法返回 ajax 更新
【发布时间】:2013-11-12 20:02:18
【问题描述】:

有没有办法 ASP.NET MVC 操作方法可以在执行内容时向视图返回部分状态响应消息?

场景:我在视图中有一个 Ajax 表单,单击一个按钮,就会对 action 方法进行 Ajax HTTP POST 调用。这个方法做了很多事情——读取 excel 文件,在 sql server 中插入/更新记录,然后发送电子邮件。

我想要的是能够向用户显示视图上的更新。比如说,在读取 excel 文件后,该状态应该显示在视图上,然后是数据库工作,然后是电子邮件。以便用户知道 action 方法中发生了什么。但是在 mvc 操作返回之前,我无法做到这一点。有什么建议或想法吗?

【问题讨论】:

    标签: c# jquery ajax asp.net-mvc


    【解决方案1】:
    • 为作业生成一个 ID 并拥有一个包含作业状态的数据库表。
    • MVC 操作创建一个新线程来完成这项工作,并且 ajax 调用立即返回。
    • 处理作业的线程在工作完成时更新数据库中记录的状态。
    • 客户端使用 ajax 轮询数据库的状态变化。

    您可以使用 SignalR,而不是轮询,但这可能有点矫枉过正。

    另外,根据您的情况,您可能希望实现一个作业队列,而不是让 MVC 操作直接启动作业线程。

    编辑 - 另一个想法.. 您可以让 MVC 操作同步完成工作,并通过 SignalR 定期将更新发送回客户端。这不需要数据库的开销,并且对于简单的情况可能会更好。

    【讨论】:

    • 谢谢,但这看起来像是新数据库和状态维护的过度杀戮。我希望找到一种简单的方法,比如在返回视图之前间歇性地显示部分视图结果。我知道它在今天的 MVC 中可能不存在,但试图看看人们是否有解决方法,因为这看起来像是当今网络预期的正常 ajax 行为。
    • 好的。我对 SignalR 一无所知,但这可能是一种选择。感谢您的意见。
    【解决方案2】:

    使用 signalR 的一些更高级的方法怎么样。

    在你的工人中你需要

    Clients.updateGaugeBar(percentage);
    

    在 JavaScript 中更新时调用的方法

    var progressHub = $.connection.progressHub;
    // Some config work
    
    // Open the connection
    $.connection.hub.start();
        progressHub.updateGaugeBar = function (perc) {
          $("#bar").html(GaugeBar.generate(perc));
        };
    

    在javascript中显示进度(您可以使用任何您喜欢的进度显示方法)。如果您不喜欢百分比,您可以返回您喜欢的任何其他消息并将它们显示给用户。

       var GaugeBar = GaugeBar || {};
    GaugeBar.generate = function (percentage) {
      if (typeof (percentage) != "number")
        return;
      if (percentage > 100 || percentage < 0)
        return;
      var colspan = 1;
      var markup = "<table class='gauge-bar-table'><tr>" +
        "<td style='width:" + percentage.toString() +
        "%' class='gauge-bar-completed'></td>";
      if (percentage < 100) {
        markup += "<td class='gauge-bar-tobedone' style='width:" +
          (100 - percentage).toString() +
          "%'></td>";
        colspan++;
      }
      markup += "</tr><tr class='gauge-bar-statusline'><td colspan='" +
        colspan.toString() +
        "'>" +
        percentage.toString() +
        "% completed</td></tr></table>";
      return markup;
    }
    

    更详细的描述 http://msdn.microsoft.com/en-us/magazine/hh852586.aspx

    【讨论】:

    • 这是个坏主意。 SignalR 对于他的要求完全是矫枉过正。当您需要将相同位的数据实时发送到多个客户端,而不仅仅是一个客户端时,SignalR 非常适合。
    • 我不会说这是矫枉过正。您可以将用户添加到组,然后只通知一位用户进度。
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2017-01-29
    相关资源
    最近更新 更多