0

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

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

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

4

2 回答 2

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

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

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

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

于 2013-11-12T20:07:42.943 回答
-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

于 2013-11-12T20:23:51.277 回答