仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1623|回复: 8
打印 上一主题 下一主题

[学习教程] NET网页编程之浅析ASP.NET高效分页的完成历程

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-16 14:25:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
实不相瞒,Java是我见过的执行效率最低的程序设计语言,前不久在CSDN论坛上有个评测,计算9999的阶乘,同样的循环算法,Java的耗时是.NET的5倍。本文要完成的是以上一页和下一页的体例完成的ASP.NET高效分页,至于以1、2、3、4如许的情势显现的ASP.NET高效分页,另有待于作者的进一步研讨ASP.NET高效分页后完成。

复杂、高效这是我们寻求的分页效果。

如今有三种很罕见的分页:
1、分页用的html和背景代码都本人写,计划和代码一样平常都只对应某个网页,难以在其他页面很好的重用
2、最复杂确当然是数据控件自带的分页功效,他的那些缺点已被会商良多年了,我就不反复了,信任略微有点气势和职业立场的程序员都不会用谁人分页
3、便宜的分页控件,能够完成代码和计划的分别,能够在多个页面重用控件,可是缺点是:每一个页面都得挪用控件并且还要在页面的背景代码里初始化控件,比方向控件里传送总页数、以后分页序号、页面巨细等
综合以上剖析,我盘算本人做个复杂的分页控件,思绪以下:

1、起首必需完成分页时期码和计划的分别,比方“下一页”,“上一页”,他们的款式写在一个文件里,而把把持他们怎样显现写在另外一个文件里,比方,到了最初一页,“最初一页”这个按钮不克不及用。以是我写了个template.html文件,这个形貌了分页时的款式
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<divstyle="width:100%;height:30px;overflow:hidden;clear:both;font-size:12px;"id="MyPagingString{10}">
<divstyle="float:left;width:50px;line-height:20px;text-align:center;height:20px;
border:1pxsolid#d8dfea;margin-left:15px;cursor:pointer;display:{0}"
>
第一页
</div>
<divstyle="float:left;width:50px;line-height:20px;text-align:center;height:20px;
border:1pxsolid#d8dfea;margin-left:15px;cursor:pointer;display:{0}"
>
上一页
</div>
<divstyle="float:left;width:50px;line-height:20px;text-align:center;height:20px;
border:1pxsolid#d8dfea;margin-left:15px;cursor:pointer;display:{0}"
>
下一页
</div>
<divstyle="float:left;width:65px;line-height:20px;text-align:center;height:20px;
border:1pxsolid#d8dfea;margin-left:15px;cursor:pointer;display:{0}"
>
最初一页
</div>
<divstyle="float:left;height:20px;line-height:20px;margin-left:20px;display:{9}">
每页纪录:<spanstyle="color:Red;">{5}</span> 以后页:<spanstyle="color:red;">{6} </span>总页数:<spanstyle="color:Red;">{7}</span> 总纪录数:<spanstyle="color:Red;">{8}</span>
</div>
</div>

<scripttype="text/javascript">
vardivTab=MyPagingString{10};
vardiv=[{1},{2},{3},{4}];
varp={
init:function(){
varpstr=document.getElementById(divTab).getElementsByTagName("div");
if(!div[0]){
pstr[0].style.color=#ccc;}
if(!div[1]){
pstr[1].style.color=#ccc;}
if(!div[2]){
pstr[2].style.color=#ccc;}
if(!div[3]){
pstr[3].style.color=#ccc;}
},
on:function(v,this_){
if(v){
this_.style.backgroundColor=#3b5998;this_.style.color=#fff;
}},
out:function(v,this_){
if(v){
this_.style.backgroundColor=#fff;this_.style.color=#000;
}},
direct:function(v,t,i){
if(!v){return;}
varindex=parseInt(i.split(|)[1]);
vartemp=i.split(|)[0]+_paging_index=;
var_cookie=document.cookie;
varcookiekey=_cookie.substring(_cookie.indexOf(temp)+temp.length,_cookie.indexOf(";",_cookie.indexOf(temp)));
document.cookie="paging_table="+i.split(|)[0];
switch(t){
case"first":
document.cookie=temp+"0";
break;
case"previous":
document.cookie=temp+(--index);
break;
case"next":
document.cookie=temp+(++index);
break;
case"end":
document.cookie=temp+arguments[3];
break;
}
document.cookie="paging=1";
document.forms[0].submit();
}};
p.init();
</script>
</body>
</html>

当程序第一次加载时,从硬盘读取分页模板文件template.html而且放进缓存,假如第二次有分页哀求时就从缓存读取,
假如,template.html,被修正则再次从硬盘读取,相似asp.net里的设置文件读取机制,

缓存代码以下:
publicstaticstringGetPageHtml()
{
pagingHtml=(string)(HttpContext.Current.Cache["paging"]);
if(string.IsNullOrEmpty(pagingHtml))
{
stringpath=null;
CacheDependencycd;
path=GetPagingTemplePath();
cd=newCacheDependency(path);
ReadPagingHtmlsFromDisk(path);
HttpContext.Current.Cache.Insert("paging",pagingHtml,cd);
}
returnpagingHtml;
}

2、对数据源的猎取的sql完成了优化,上面是两种经常使用的分页语句,第二条语句的上风在于:
notin会引发全表扫描,并且不会利用会萃索引,而第二条语句没有如许的缺点
selecttopsize*fromtablewhereidnotin(selecttopindex*sizeidfromtable)

selecttopsize*fromtablewhereid>(selectmax(id)from(selecttopindex*sizeidfromtable)asT)
对用户输出的sql语句,比方“select*fromtable”主动优化成下面的第二种格局

上面这个办法完成了庞大sql语句转化
publicstaticstringAnalytiCSSql(stringsql,intindex,intsize)
{
stringkeyid=null,columns=null,table=null,orderby=null,wherestr=null,originalSql=null;
originalSql=sql;
originalSql=originalSql.Replace(originalSql.Substring(originalSql.IndexOf("select")+8,originalSql.IndexOf("from")-8-originalSql.IndexOf("select")),"count(*)");
if(sql.IndexOf("*")!=-1)
{
if(sql.IndexOf("|")!=-1)
{
keyid=sql.Substring(sql.IndexOf("|")+1,sql.IndexOf("",sql.IndexOf("|"))-sql.IndexOf("|")-1);
}
else
{
keyid="id";
}
columns="*";
}
else
{
keyid=sql.Substring(sql.IndexOf("select")+6,sql.IndexOf(",")-sql.IndexOf("select")-6);
columns=sql.Substring(sql.IndexOf("select")+6,sql.IndexOf("from")-6-sql.IndexOf("select"));
}
if(sql.IndexOf("where")!=-1)
{
wherestr="where";
if(sql.IndexOf("order")!=-1)
wherestr+=sql.Substring(sql.IndexOf("where")+7,sql.IndexOf("order")-sql.IndexOf("where")-7);
else
wherestr+=sql.Substring(sql.IndexOf("where")+7);
}
table=GetSqlTable(sql);
if(sql.IndexOf("order")!=-1)
{
orderby=sql.Substring(sql.LastIndexOf("by")+2);
}
else
{
orderby=keyid;
}

sql="selecttop"+size.ToString()+""+columns+"from"+table+"where"+keyid+">isnull((selectmax("+keyid+")from(selecttop"+(index*size).ToString()+""+keyid.ToString()+"from"+table+wherestr+"orderby"+orderby+")asT),0)orderby"+keyid;
returnoriginalSql+";"+sql;
}
必要增补的是分页排序时id成绩:

假如你的SQL语句写成了如许:
1、select*fromtablewhere...order...
则优化后的sql以id排序

2、select*|CustomerIdfromtablewhere...order...
则优化后的sql以CustomerId排序

2、selectCustomerId,CustomerName,...fromtablewhere...order...
则优化后的sql以CustomerId排序
==================================

然后依据以后信息格局化分页显现的htmls,比方,页数、页号、总纪录数、和高低页按钮是不是可用。详细代码:
publicstaticstringAnalyticsPagingHtmls(stringtableAndindex,intcount,intsize,intindex)
{
string_GetPageHtml=GetPageHtml();
returnstring.Format
(
_GetPageHtml.Substring(0,_GetPageHtml.IndexOf(",{4}];")+6),
count==0||count<=size?"none":"",
index==0?"0":"1",
index==0?"0":"1",
(index+1==((count%size)==0?count/size:((count/size)+1)))?"0":"1",
(index+1==((count%size)==0?count/size:((count/size)+1)))?"0":"1",
size,
index+1,
(count%size)==0?count/size:(count/size)+1,
count,
count==0?"none":"",
tableAndindex,
((count%size)==0?count/size:((count/size)+1))-1
)
+_GetPageHtml.Substring(_GetPageHtml.IndexOf(",{4}];")+6);
}

怎样利用这个分页办法:
第一步:在设置文件里写下以下代码:
<configSections>
<sectionname="MyPaging"type="System.Configuration.NameValueSectionHandler"/>
</configSections>
<MyPaging>
<addkey="Paging"value="~/Paging/template.htm"/>
</MyPaging>

第二步:在cs文件里,间接挪用就行
protectedvoidPage_Load(objectsender,EventArgse)
{
if(MyPaging.IsPaging)
{
p1.InnerHtml=MyPaging.ExecutePaging(MyRep,"selectCustomerId,ShipName,ShipAddress,ShippedDatefromorders",0,5);
p2.InnerHtml=MyPaging.ExecutePaging(MyRep2,"selectCustomerID,CompanyName,ContactName,Addressfromdbo.Customers",0,5);
}
}

前台代码:
<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title></title>
</head>
<body>
<formid="form1"runat="server">
<asp:RepeaterID="MyRep"runat=server>
<ItemTemplate>
<divstyle="width:100%;height:20px;">
<%#Eval("CustomerID")%>
<%#Eval("ShipName")%>
<%#Eval("ShipAddress")%>
<%#Eval("ShippedDate")%>
</div>
</ItemTemplate>
</asp:Repeater>
<divid="p1"runat=server></div>

<asp:RepeaterID="MyRep2"runat=server>
<ItemTemplate>
<divstyle="width:100%;height:20px;">
<%#Eval("CustomerID")%>
<%#Eval("CompanyName")%>
<%#Eval("ContactName")%>
<%#Eval("Address")%>
</div>
</ItemTemplate>
</asp:Repeater>
<divid="p2"runat=server></div>
</form>
</body>
</html>

完成效果:

也不知道,我同学昨天说数据挖掘很好。
兰色精灵 该用户已被删除
沙发
发表于 2015-1-18 14:31:49 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
小妖女 该用户已被删除
板凳
发表于 2015-1-24 15:24:12 | 只看该作者
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
分手快乐 该用户已被删除
地板
发表于 2015-2-1 20:48:39 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
若天明 该用户已被删除
5#
发表于 2015-2-7 17:11:05 | 只看该作者
ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
柔情似水 该用户已被删除
6#
发表于 2015-2-22 20:00:28 | 只看该作者
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
第二个灵魂 该用户已被删除
7#
发表于 2015-3-7 01:59:05 | 只看该作者
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
因胸联盟 该用户已被删除
8#
发表于 2015-3-14 08:41:35 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
飘灵儿 该用户已被删除
9#
发表于 2015-3-21 02:02:26 | 只看该作者
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-20 14:04

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表