计算期间的MVC更新视图

时间:2013-07-12 10:04:45

标签: asp.net-mvc viewbag

在我的控制器中,我需要做一些可能需要很长时间的操作,所以我想在每一步结束时更新视图。我是MVC的初学者,根据我所知,每次我想从控制器更新视图时我都要做类似的事情

ViewBag.Result = "OK";
return View();

但在这种情况下,控件进入视图,控制器无法继续其操作。

感谢您的帮助!

3 个答案:

答案 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();