在我的控制器中,我需要做一些可能需要很长时间的操作,所以我想在每一步结束时更新视图。我是MVC的初学者,根据我所知,每次我想从控制器更新视图时我都要做类似的事情
ViewBag.Result = "OK";
return View();
但在这种情况下,控件进入视图,控制器无法继续其操作。
感谢您的帮助!
答案 0 :(得分:1)
您必须在单独的线程中启动长时间运行操作,例如使用TPL并立即返回视图:
public ActionResult StartLongRunningAction() {
Task.Factory.StartNew( () => {
// code your long running action here or call a method
});
return View();
}
要向您的客户发送进度消息,我建议您使用SignalR等框架。
答案 1 :(得分:1)
只需使用ajax即可获取操作信息。 jQuery可以帮助您简化ajax代码。
答案 2 :(得分:0)
我会使用单独的线程在服务器上运行长时间运行的操作,并且我会向服务器发出 Ajax 请求,以便每N秒获取一次操作状态。
您也可以考虑WebSockets / SignalR。但并非所有浏览器都支持此技术。 NuGet上有一些用于SignalR实现的库。 http://nuget.org/packages?q=signalr
我建议您查看此视频http://www.asp.net/signalr/videos/getting-started/signalr-and-web-sockets
如果您需要更快的解决方案,可以像这样更新视图:
<p>@Model.OperationState</p>
@if (Model.OperationIsInProgress){
<script>
setTimeout("location.reload(true);", 10000);
<script>
}
但它不是异步方法。这个js每10秒重新加载一次页面。
要启动新线程,您可以使用简单的System.Threading类:
using System.Threading;
var thread = new Thread(() => {
//Call your long running operation here
});
thread.Start();