C#发现之旅-高性能ASP.NET树状列表控件(上)

已有树状列表控件分析发现问题

近期发现有人在ASP.NET项目开发中使用一种叫dtree的树状列表组件加载缓慢。这也是笔者撰写本章的动机。毛主席教导我们,做事要发现问题,分析问题和解决问题。首先我们发现了已有的树状列表WEB控件加载缓慢的问题,接下来就很自然的是分析问题了。

下图就是dtree 运行界面的例子


分析问题

现在我们分析问题,对使用dtree生成树状列表的程序代码的分析,可以了解程序运行过程如下图所示

在这样的程序中,首先服务器端的C#代码查询数据库,然后根据查询所得数据拼凑出一个Javascript代码字符串,然后发往客户端,客户端浏览器获得这个Javascript代码字符串并开始执行它,而在Javascript脚本中也是字符串拼凑出一段HTML代码字符串,然后使用浏览器提供的 document.write方法或obj.innerHTML属性将生成的HTML字符串填充到HTML页面中进行展示。

这是是分析了dtree的流程,但使用其他的一些树状列表控件也大体如此。

现在我们根据这个流程图来判断是哪个环节速度缓慢。基本上数据库本身查询速度是没问题;将查询结果传递到C#程序中问题也不大,因为一般的数据库服务器和ASP.NET程序是在一台电脑上或者同一个高速局域网中;C#程序生成Javascript字符串的过程也是没多大问题,因为C#运行速度是相当的快的,而且还有StringBuilder来加速字符串拼凑操作,因此只要逻辑算法没有问题,速度是有保障的。总体来说服务器端内部是没有速度问题。

将Javascript字符串通过网络从服务器端发送到客户端,所花的的时间是字符串长度除以网络传输速度,若WEB系统运行在高速的局域网中,则速度没多大问题,但若WEB程序运行在缓慢的广域网或英特网中,则Javascript字符串长度会比较大的影响程序运行速度。由于公司系统主要运行在局域网中,因此网络传输速度不是主要问题。

在客户端浏览器中,浏览器接受并执行Javascript脚本代码,在Javascript脚本中使用字符串拼凑来生成用于展现树状列表的HTML 字符串。Javascript代码是解释方式执行的,速度相当慢,而字符串拼凑操作也是比较缓慢的操作,Javascript中没有任何手段来优化字符串拼凑操作。因此由Javascript代码生成HTML字符串的过程是缓慢的,这是一个速度瓶颈。

Javascript代码还调用浏览器提供的document.write函数或innerHTML属性将生成的HTML字符串填充到页面中,浏览器会解析这个HTML代码并展现出树状列表。由于document.write或innerHTML是运行在浏览器内部的,外部程序无法控制,而且速度也不算慢,因此这里也就没有什么好优化的。

经过上述分析,可以看到整个展现树状列表的过程中最缓慢的环节就是使用Javascript脚本来生成HTML代码字符串,其次就是数据从服务器端发送到客户端的过程。若一个树状列表要显示数千个节点,则Javascript脚本将拼凑出几百K甚至过MB的HTML字符串,这个过程是相当缓慢的,很容易导致IE浏览器由于脚本运行过于缓慢而提示用户是否继续执行脚本。

因此Javascript脚本生成HTML字符串将是我们主要的优化环节,也是新开发的树状列表控件的重点关注部分。

时间: 2025-01-29 17:31:33

C#发现之旅-高性能ASP.NET树状列表控件(上)的相关文章

C#发现之旅-高性能ASP.NET树状列表控件(下)

TreeNode 模板 TreeNode模板是XSLT模板文档的主要部分,其代码为 <!-- ******************* 输出一个树状列表节点 *************************** --> <xsl:template name="TreeNode"> <!-- 定义一个 Level 参数,表示节点层次,默认 0 --> <xsl:param name="Level">0</xsl:p

C#发现之旅-高性能ASP.NET树状列表控件(中)

第一段HTML代码块 若控件的"DynamicLoadChildNodes"属性值为true,也就是控件运行在客户端动态加载子节点,则输出支持客户端动态加载子节点的HTML代码,首先输出一个名为"SkyTreeViewControlTempXML"的XML数据岛标签,并将它的 "onreadystatechange"事件绑定到"SkyTreeViewControlDynamicLoadChildNodes"的 Javascri

systreeview32-跨进程控制SysTreeView32树状图控件的难题

问题描述 跨进程控制SysTreeView32树状图控件的难题 最近公司在做一个智能化股票交易的项目,需要控制股票交易软件树状图进行翻页,刚开始我使用普通的WM_LBUTTONDOWN和WM_LBUTTONUP消息进行发送,发现只是实现了选择树状图节点,而没有达到实际效果,也就是控制页面跳转,遂怀疑是WM_NCHITTEST的问题,可是加入了WM_NCHITTEST消息,并把截获的消息全部依次发送后,仍无法成功.后来发现在WM_LBUTTONUP消息后,有一个关键的TVM_HITTEST我没有进

asp.net-ASP.NET中用UPLOADfile控件上传,服务器上传不上APK

问题描述 ASP.NET中用UPLOADfile控件上传,服务器上传不上APK 用uploadfile控件做了个简单的上传,本地测试可以上传图片和APK,但是传到服务器 上就上传不了APK, 等了好久都不行的..可以上传图片的..请问是怎么问题? 没有报错,点上传按钮了等到网页刷新超时... 服务器IIS已经加入了MIME了.. 上传目录也设置了EVERYONE权限了...http://jcb.wd900.com/test.aspx 上面是测试路径 ..大家知道是怎么回事吗? 解决方案 asp.

ASP.NET中BulletedList列表控件使用及详解_基础应用

BulletedList 控件创建一个无序或有序(编号)的项列表,它们分别呈现为 HTML UL 或 OL 标记.可以指定项.项目符号或编号的外观,可以静态定义列表项或通过将控件绑定到数据来定义列表项,也可以在用户单击项时作出响应. 对于ASP.NET 1.x里要动态显示Bulledted List时,要么自己利用HTML的<ol>或<ul>元素构造,要么就是"杀鸡用牛刀"的动用Repeater来显示.前者过于死板,后者过于Overkill,也许微软听到这种声音

ASP.NET 2.0移动开发之列表控件

asp.net|控件 概述 在很多情况下,我们都会使用到列表控件来方便用户选择一些选项.例如在某网站上注册新用户时,通常会询问你的性别是"男"还是"女",这时我们用单项按钮以供用户做出相应的选择.还有当你填写自己的家庭地址时,通常会使用到一个包含各省省名的下拉列表来供用户直接选择,这样可以减少用户的输入量.上述的这些单项按钮和下拉列表都在ASP.NET移动程序中都是以列表控件的形式存在的.我们可以使用列表控件来呈现各种形式(单项.多选.下拉列表)的列表,以供用户选择

利用ASP改进文档上载控件 (转)

控件 利用ASP改进文档上载控件 随着互联网的发展,人们发布和获取信息的方式发生了根本的变化,越来越多的人开始把网络作为最重要的发布和获取信息的途径,同时,能发布并令信息共享的技术也越来越多.虽然这些技术为开发人员带来了极大的便利,但是由于种种原因,其中有些技术还存在着这样或那样的缺陷.因此,开发人员在选择和使用各种技术时,一定要认清这些技术的优点和局限性,取长补短,才能设计出功能完善的程序. 提出问题 笔者曾在建设企业内部信息网工程中开发过基于Web的文档资源共享信息网站.该网站要求上载的文档

asp.net基础学习之控件的使用方法_实用技巧

本文为大家分享了asp.net控件的使用方法,供大家参考,具体内容如下 1.asp.net页面插入c#代码 事先声明: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 引入格式: <% %> 变量可以:<%=val %> <body> &

asp.net中使用 Repeater控件拖拽实现排序并同步数据库字段排序_实用技巧

数据库表中有一个单位表,里面包括ID.Name.Order等字段,现在有个后台管理功能,可以设置这些单位在某些统计表格中的先后显示顺序,于是想到用拖拽方式实现,这样操作起来更简便. 使用了GifCam软件做了一个示例动画,效果如下图所示: 于是就动手起来,发现jquery.ui中提供sortable函数,可用于排序,界面中从数据库绑定的单位使用Repeater控件,下面简单介绍下主要步骤: 1.项目中使用到的jquery-1.7.2.min.js和jquery-ui.min.js请点击进行下载,