.Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能
.Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能
我的项目需求是:在.net4.5中用mvc5实现上传xml文件,后台实时导入数据库时传到前台进度,进度条实现动态在走。
网上看了很多实现此需求的方法(服务器轮训向客户端发送消息)ajax、webscoket、singal等。
之前的代码是前段用定时器ajax去访问后台的进度数据。然后给进度条赋值。发现有时候ajax请求总出现pending的状态。
之前的缓存实现代码:
var cc=true;
window.setTimeout(function () {
$.ajax({
url: "/Import/GetImportRate",
dataType: "json",
type: "post",
async: true,
success: function (data) {
if (data == null || data.rate == null) {
}
else if (data.rate != "100" || data.rate != 100) {
$('#p').progressbar('setValue', parseInt(data.rate));
$("#ppp").text("正在导入--" + data.currentname);
}
else {
}
}
});
if (cc) {
setTimeout(arguments.callee, 2000);
}
}, 2000);
public JsonResult GetImportRate()
{
var rate = HttpRuntime.Cache.Get("Progress");
var cutname = HttpRuntime.Cache.Get("CurrentName");
if (rate == null)
{
rate = "";
}
if (cutname == null)
{
cutname = "";
}
return Json(new
{
rate = rate,
currentname = cutname,
});
}
将数据保存在Cache中,每次ajax获取数据。
下面使用singal:
1.首先需要在setup中注册singalr

2.创建一个Hubs文件夹,其中创建ChatHub类,继承Hub
using System;
using System.Web;
using Microsoft.AspNet.SignalR;
namespace SignalRChat
{
public class ChatHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addNewMessageToPage(name, message);
}
}
}
3.前段代码:
在需要用到的页面引用js
<script src="~/Scripts/jquery.signalR-2.0.3.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="~/signalr/hubs"></script>
<!--SignalR script to update the chat page and send messages.-->
然后js代码
$(function () {
var chat = $.connection.chatHub;
chat.client.addNewMessageToPage = function (name, message) {
//此方法对应着ChatHub类中的send方法,在此处理服务器
//传到客户端的信息。
};
$.connection.hub.start().done(function () {
});
});
4.在其他的Controller中使用Send方法去实现服务器消息传到客户端。
var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
context.Clients.All.addNewMessageToPage(name, message);
5.我项目中最后实现的实时显示进度条进度和相关代码:
var chat = $.connection.chatHub;
chat.client.addNewMessageToPage = function (name, rate) {
if (rate != "100" || rate != 100) {
$('#p').progressbar('setValue', parseInt(rate));
$("#ppp").text("正在导入--" + name);
}
};
$.connection.hub.start().done(function () { }); $("#btnSave").click(function () {
if (filenamelist == "" || filenamelist == null) {
return;
}
else {
$.ajax({
url: "/Import/ImportSingleFiles?allfilename=" + escape(filenamelist),
dataType: "json",
type: "post",
success: function (data) { if (data.result == true) {
parent.layer.msg("全部导入成功!"); $('#p').progressbar('setValue', parseInt(100)); }
else {
parent.layer.msg("导入出错!请从新选择文件!");
$("#ppp").text("导入出错!请从新选择文件!");
$("#ppp").css("color", "red");
$("#tip").hide();
alert(data.message); $("#btnBack").show();
}
}
})
}
});
6.实现结果

.Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能的更多相关文章
- ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-th ...
- ASP.NET技巧:教你制做Web实时进度条
网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一 ...
- ASP.NET 多线程 监控任务执行情况,并显示进度条
关于多线程的基本概念和知识在本文中不多讲,而且我懂的也不是很透,说的太多误人子弟...对于我来说,做本文提到的功能够用就行,等实现其他效果不够用的时候,再深入研究 推荐看园子里的两篇博客应该就有个基本 ...
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“,只是我个人更喜欢凡是求个所以 ...
- PHP中使用Session配合Javascript实现文件上传进度条功能
Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP .4以前,实现这样的进度条并不容易 ...
- Java实现命令行中的进度条功能
前言 最近在写一个命令行中的下载工具,既然是下载文件用的,那么实时显示下载进度是非常有必要的.因此,就有了这里对进度条的实现尝试. 预览图 还是先预览下效果图吧. 这里是cmd里面的效果,总体看着还行 ...
- ASP.NET MVC计划任务实现方法(定时执行某个功能)
系统中定时执行某个任务是比较常用的功能,如一个部门定期向上级部门上报数据是一个典型的例子,下面就简单说说在.net mvc中如何实现定时执行某个功能的方法. 1.首先修改Glocal.asax文件,在 ...
- asp.net 的一个简单进度条功能
我们先看下效果 我点击了按钮后他会显示进度页面,进度完成后,进度条消失,其实也是比较简单的了. 我们需要一个进度条代码文件ProgressBar.htm(注意:是没有head这些标签的) <sc ...
- WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】
第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体 在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体 ...
随机推荐
- Oracle 基表 X$KSMLRU
Oracle 基表 X$KSMLRU 该表是Oracle的一个内部表.当SQL或者PL/SQL块向shared pool中请求一个大的连续的空间时,如果shared pool中连续的可用空间 不足,就 ...
- react判断点击位置是否为组件内,实现点击外部触发组件内事件
1.导入 import {findDOMNode} from 'react-dom' 2.绑定ref <div ref="refTest" </div> 3.绑定 ...
- url protocol
首先注册服务 方法1,保存为reg文件直接执行,需要按需修改路径 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\EasyPrint] ...
- Oracle数据库提高sql查询效率总结
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...
- Python实现将不规范的英文名字首字母大写
Python实现将不规范的英文名字首字母大写 这篇文章给大家主要介绍的是利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.文中给出了三种解决方法,大家可以根据需要选 ...
- UnitTest之Xunit
Unit Test 1.建立单元测试 新建一个类库项目,在Nuget中搜索xunit,选择 xUnit.net 和 xunit.runner.visualstudio 插件包安装. xunit.run ...
- Django auth 用户验证
## Django本身内建这样的功能,admin管理页面就使用了这样的验证机制,admin管理页面就有Groups和Users选项 ## 需要在models.py中导入 from django.con ...
- python-Web-django-qq扫码登陆
1.建路由 2.写qq登录的a链接 3 在控制器的loginQq的方法:拼接url,跳转到这个url: 去:https://graph.qq.com/oauth2.0/authorize?respon ...
- v8 google 下载及编译
ubuntu环境下进行 参考文档: http://code.google.com/p/v8/wiki/BuildingWithGYP (一) 源码下载及编译 1, Google v8 官网:http: ...
- tcl的第二个脚本
set val(chan) Channel/WirelessChannel ;#Channel Typeset val(prop) Propagation/TwoRayGround ;# radio- ...