最近公司网站出现了访问速度变慢,经过查看是在构造树的过程CPU耗用严重,问题原因是构造树的过程采用了递归方法一次性构造的树的所有节点,其实后台获取数据的速度倒是很快,比较慢的地方就是Treeview构造每个节点的过程。由于原来的程序采用的是vs2003,Treeview还不支持异步加载,ajax控件也没有合适的版本,一般是对2.0的,所以无奈之下只好,找了一个ajax的动态链接库dll文件,实现了逐级加载节点。现在把整个过程总结一下,希望对维护vs2003程序的朋友们有所帮助。
第一步:引入ajax的dll文件(放在文章后面的附件里)
第二步:修改web.config配置文件
<system.web>
<!-- by dingsea -->
<httpHandlers>
<!--增加的内容-->
<add verb="POST,GET" path="ajax/*.ashx" type="BorgWorX.Web.Core.Ajax.PageHandlerFactory, BorgWorX.Web.Core.Ajax" />
</httpHandlers>
第三步:在page_load中注册ajax
private void Page_Load(object sender, EventArgs e)
{
//注册ajax页面或用户控件
BorgWorX.Web.Core.Ajax.Utility.RegisterTypeForAjax(typeof(DownPara));
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
TreeViewDataBind();
}
}
第四部:编写后台方法
//编写Ajax方法,中括号的内容是必须的
[BorgWorX.Web.Core.Ajax.AjaxMethod()]
public System.Data.DataSet getNodeList(string parentNode){
System.Data.DataTable tab = new System.Data.DataTable();
tab.Columns.Add("NodeData");tab.Columns.Add("Text");
tab.Columns.Add("ImgUrl");
tab.Columns.Add("IsLeaf");
tab.Columns.Add("NavigateUrl");
System.Data.DataSet ds= new System.Data.DataSet();
IList nodeList = ServiceSysHelper.GetParaSortOrParaInfo(parentNode,"02");//获取节点
if(nodeList==null || nodeList.Count==0)
return null;
foreach(SoftWarePara para in nodeList)
{
System.Data.DataRow row = tab.NewRow();
row["NodeData"] = para.SoftwareParaId;
row["Text"] =para.SoftwareParaName;
tab.Rows.Add(row);
}
ds.Tables.Add(tab);
return ds;
}
第五步:编写前台js,解析后台返回的dataset
<script language="javascript">
var Index;
function ds()
{
//DownPara是当前页面或者用户控件的名称,TVPara是Treeview用户控件的id,getNodeList是后台对应ajax调用的方法
DownPara.getNodeList(<%=TVPara.ClientID %>.getTreeNode(Index).getAttribute("NodeData"),returnDs_callback);
}
function returnDs_callback(response)
{
var n=<%=TVPara.ClientID %>.getTreeNode(Index);
var load=n.getChildren();
if(load.length!=1){
return;
}
else
{
var loadNode=load[0];
loadNode.remove();
}
//ds为后台返回的数据集
var ds=response.value;
if(ds!=null && ds.Tables!=null && typeof(ds)=="object")
{
for(var i=0;i<ds.Tables[0].Rows.length;i++)
{
var newNode=<%=TVPara.ClientID %>.createTreeNode();
newNode.setAttribute("NodeData",ds.Tables[0].Rows[i].NodeData);
newNode.setAttribute("Text",ds.Tables[0].Rows[i].Text);
if(ds.Tables[0].Rows[i].IsLeaf=="01")
{
newNode.setAttribute("ImageUrl",ds.Tables[0].Rows[i].ImgUrl);
newNode.setAttribute("NavigateUrl",ds.Tables[0].Rows[i].NavigateUrl);
}
//构造虚拟节点
if(ds.Tables[0].Rows[i].IsLeaf=="02")
{
var loadNode=<%=TVPara.ClientID %>.createTreeNode();
loadNode.setAttribute("Text","Loading......");
newNode.add(loadNode);
}
n.add(newNode);
}
}
else{
return;
//alert(response.error);
}
}
</script>
<script language=javascript event=onexpand for="<%=TVPara.ClientID %>">
Index= window.event.treeNodeIndex;
//alert(Index);
if(Index=='0')return;
ds();
</script>
总结:
1、这个ajax的dll用法还是比较简单的,不用动手编写ajax的请求的js
2、ajax调用后台方法的参数可能只能是一个,我试图传入多个参数没有成功,
3、response 返回的是否也只能为dataset(待验证),我试图返回其他类型的参数没有成功
4、希望大家集思广益,有好的经验分享一下。
附件:dll文件