在我的控制器中,我需要进行一些可能需要很长时间的操作,所以我想在每个步骤结束时更新视图。我是 MVC 的初学者,根据我所知道的,每次我想从控制器更新视图时,我都必须做类似的事情
ViewBag.Result = "OK";
return View();
但在这种情况下,控件转到视图,控制器无法继续其操作。
谢谢你的帮助!
在我的控制器中,我需要进行一些可能需要很长时间的操作,所以我想在每个步骤结束时更新视图。我是 MVC 的初学者,根据我所知道的,每次我想从控制器更新视图时,我都必须做类似的事情
ViewBag.Result = "OK";
return View();
但在这种情况下,控件转到视图,控制器无法继续其操作。
谢谢你的帮助!
您必须在单独的线程中启动长时间运行的操作,例如使用 TPL 并立即返回视图:
public ActionResult StartLongRunningAction() {
Task.Factory.StartNew( () => {
// code your long running action here or call a method
});
return View();
}
要将进度消息发送给您的客户,我建议您使用像SignalR这样的框架。
只需使用 ajax 即可获取操作信息。jQuery 可以帮助您简化 ajax 代码。
我会使用单独的线程在服务器上运行长时间运行的操作,并且我会每 N 秒向服务器发出Ajax请求以获取操作状态。
您还可以考虑 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();