在返回View之前,从asp.net mvc5 action方法返回ajax更新

时间:2013-11-12 20:02:18

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

ASP.NET MVC操作方法是否可以在执行内容时将部分状态响应消息返回到视图?

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

我想要的是能够向用户显示视图上的更新。比如,在读取excel文件后,该状态应该显示在视图上,然后db工作,然后通过电子邮件发送。这样用户就可以知道动作方法中发生了什么。但是直到mvc动作返回,我才能做到这一点。有什么建议或想法吗?

2 个答案:

答案 0 :(得分:0)

  • 为作业生成ID,并拥有一个包含作业状态的数据库表。
  • MVC操作创建一个新线程来完成工作,并且ajax调用立即返回。
  • 处理作业的线程在工作完成时更新数据库中记录的状态。
  • 客户端使用ajax轮询数据库以查看状态更改。

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

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

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

答案 1 :(得分:-1)

如何使用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