近日做一即时信息提示功能时采用定时刷新,原来使用.net的ajax方法获取数据,一切完好,但是当有大量数据导出成xls文件或其他文件时,便会产生浏览器死掉的情况!不过在firefox下正常。通过多次测试,发现是ajax方法引起的bug,不过具体是什么原因,至今未获答案,后放弃.net的ajax方法,决定使用jQuery的getJSON方法来从客户端取服务器端数据,具体使用方法如下:
一,新建一般处理程序GetMsg.ashx
<%@ WebHandler Language="C#" Class="GetMsg" %>
using System;
using System.Web;
using FOB.Core.Define;
using FOB.Core.Entity;
using FOB.CMS.Entity;
using JSONSharp;
using System.Text;
using System.Web.SessionState;//在ashx文件使用session时引用
public class GetMsg : IHttpHandler, IReadOnlySessionState
{
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write(GetNewMsg());
}
public string GetNewMsg()
{
System.Data.DataTable dt =new System.Data.DataTable();//获取datatable
return CreateJsonParameters(dt);
}
/// <summary>
/// 将datatable转化为Json格式字符串(网上收集)
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string CreateJsonParameters(System.Data.DataTable dt)
{
StringBuilder JsonString = new StringBuilder();
if (dt != null && dt.Rows.Count > 0)
{
JsonString.Append("[");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append("{ ");
for (int j = 0; j < dt.Columns.Count; j++)
{
if (j < dt.Columns.Count - 1)
{
JsonString.Append(dt.Columns[j].ColumnName.ToString() + ":" + "/"" + dt.Rows[i][j].ToString() + "/",");
}
else if (j == dt.Columns.Count - 1)
{
JsonString.Append(dt.Columns[j].ColumnName.ToString() + ":" + "/"" + dt.Rows[i][j].ToString() + "/"");
}
}
if (i == dt.Rows.Count - 1)
{
JsonString.Append("} ");
}
else
{
JsonString.Append("}, ");
}
}
JsonString.Append("]");
return JsonString.ToString();
}
return null;
}
public bool IsReusable {
get {
return false;
}
}
}
二,新建web页面
1.js脚本部分
$(document).ready(function() {
getMessages();
});
function getMessages()
{
var data_html="";
$.getJSON(
"GetMsg.ashx",//数据提供文件(注意路径)
{MsgID:"1"},//传递查询参数(可以不要)
function(json){
//循环取json中的数据
if(json!=null){
$.each(json,function(i)
{
data_html += "<a>" + json[i].Subject + "</a><br>";
}
)
$.messager.show(0, data_html);//messager是别人写的一个基于jQuery的消息插件
}
}
}
)
}
$(document).ready(function(){
window.setInterval("getMessages()",10000);
});
由于在web页面中没有写html,html代码部分省去。