我只想在长时间运行服务器调用时创建一个进度条。当控制器执行长时间运行的作业时,我无法在控制器上创建ajax发布请求。
我想创建一个额外的操作来获取当前长时间运行的任务的实际语句。@H_301_3@我试图在ajax请求中创建poll,然后我可以从服务器端返回状态并将其显示在客户端进度条上。有任何想法吗 ?
解决方法
使用SignalR,最合适的方法就是做到这一点。请在
https://www.nuget.org/packages/Microsoft.AspNet.SignalR/2.1.2下载Microsoft SignalR
在名为集线器的项目路径中的单独文件夹中创建集线器类,将两个类文件添加到集线器文件夹中
Startup.cs
using Owin; using Microsoft.Owin; [assembly: OwinStartup(typeof(SignalRChat.Startup))] namespace SignalRChat { public class Startup { public void Configuration(IAppBuilder app) { // Any connection or hub wire up and configuration should go here app.MapSignalR(); } } }
ProgressHub.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Web; using Microsoft.AspNet.SignalR; namespace RealTimeProgressBar { public class ProgressHub : Hub { public string msg = "Initializing and Preparing..."; public int count = 1; public static void SendMessage(string msg,int count) { var message = "Process completed for " + msg; var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProgressHub>(); hubContext.Clients.All.sendMessage(string.Format(message),count); } public void GetCountAndMessage() { Clients.Caller.sendMessage(string.Format(msg),count); } } }
在控制器中,
// assemblies using Microsoft.AspNet.SignalR; using RealTimeProgressBar; //call this method inside your working action ProgressHub.SendMessage("initializing and preparing",2);
在视图中,
<!--The jQuery library is required and is referenced by default in _Layout.cshtml. --> <!--Reference the SignalR library. --> <script src="~/Scripts/jquery.signalR-2.1.2.min.js"></script> <!--Reference the autogenerated SignalR hub script. --> <script src="~/signalr/hubs"></script> <!--SignalR script to update the chat page and send messages.--> <script type="text/javascript"> $(document).ready(function () { $("#progressBar").kendoProgressBar({ min: 0,max: 100,type: "percent",}); }); function StartInvoicing() { var progressNotifier = $.connection.progressHub; // client-side sendMessage function that will be called from the server-side progressNotifier.client.sendMessage = function (message,count) { // update progress UpdateProgress(message,count); //alert(message); }; // establish the connection to the server and start server-side operation $.connection.hub.start().done(function () { // call the method CallLongOperation defined in the Hub progressNotifier.server.getCountAndMessage(); }); } // Update the progress bar function UpdateProgress(message,count) { var result = $("#result"); result.html(message); $("#progressBar").data("kendoProgressBar").value(count); } </script>
有关详细信息,请参阅Google的帮助下的一些现有文章