ASP.NET MVC操作方法是否可以在执行内容时将部分状态响应消息返回到视图?
场景:我在视图中有一个Ajax表单,只需单击一个按钮,就可以对action方法执行Ajax HTTP POST调用。这个方法做了很多东西 - 读取excel文件,在sql server中插入/更新记录,然后发送电子邮件。
我想要的是能够向用户显示视图上的更新。比如,在读取excel文件后,该状态应该显示在视图上,然后db工作,然后通过电子邮件发送。这样用户就可以知道动作方法中发生了什么。但是直到mvc动作返回,我才能做到这一点。有什么建议或想法吗?
答案 0 :(得分:0)
您可以使用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