Asp.Net系列两条语句实现Repeater通用的Ajax分页[XCallback vs JQ in Ajax]

这篇文章将通过Repeater的Ajax分页示例,讲解Ajax的另一个框架 XCallback。当然不管你是哪个Ajax框架的粉丝,

这种分页都很实用,你可以使适用与你喜欢的框架, 毕竟大家都喜欢repeater的灵活快速,但是却没有提供内置分页,

现在你只要在页面里添加一条语句就可以实现ajax效果的分页,

文章叙述中还会把XCallback与JQ在Ajax使用上做个比较,如果我说得不好,欢迎JQ的粉丝指正。 大家先看看前后台页面,

以及在线示例,如果觉得的有帮助,那就接着往下看,示例源码什么的都有 。

以下是前台页面 需要编写的js代码只有以下几条语句,getPage包含了调用前和数据从服务器返回的方法

[注:ajax.reg('要传得数据','服务器端方法')], 如果后台页面只有一个可调用的方法,服务器方法名可省略

事实上你可以在ajax.reg()的上面写多条语句,这些语句将在回调前发生,你同样可以在return的下面写多条语句,

这些语句将在服务器返回数据后执行,这样的函数结构有很多优点,

可以使回调前和回调后的数据状态保持一致,保持上下文的连贯性,可以更好的共享变量,JQ在ajax使用上也是因简洁而深入人心, 我相信这段XCallback代码和JQ有一比, 甚至更简洁, 没有多余的东西,完全把你的注意力集中在业务上,而不是具体的技术细节上。

Code

这个是后台代码,也很简单,只有两条语句,JQ在页面后台上并没有提供这种简洁的支持,如果用JQ实现这种简洁
只能是要么自己写个类来统一管理JQ的Request来分配具体参数对应的方法或是做个WebService,其实XCallback
已经在前后台都作了必要的封装,所以你用起来会很方便 
using System;
using
 System.Collections.Generic;
using
 System.Web;
using
 System.Web.UI;
using
 System.Web.UI.WebControls;

public partial class
 _Default : XCallback
{
    
protected void Page_Load(object
 sender, EventArgs e)
    {
        InitAjaxStyle(
null
);
    }
    
public override string
  HandlerClientInNormal()
    {
        
return Tg_Admin.ExecutePage("select * from demo_page"int.Parse(XContext), 10, Rep, this
);
    }
}
无论你是用ajax或是用基本的页面加载只要调用ExecutePage()这个方法 ,就可以实现Repeater分页 ,
至于分页的具体代码我就不贴了,那都是老生常谈的事,代码和事例如下:
http://chenxumi1.vhost015.cn/paging.aspx
http://chenxumi1.vhost015.cn/Paging_XCallback.rar
下面我只将列举ExecutePage()一条代码 ,如下:
 return XCallback.GetHtml(Rep)+"<p>"+ PageStr +"</p>";
XCallback.GetHtml() 是将System.Web.UI.Control实例( 例如Panel,Repeater,GridView ...)生成HTML代码 ,
例如下面将会把rep(Repeater Rep) 生成Html代码异步传给客户端, 也许这时JQ粉丝会说你看你将生成的html代码
输出到客户端,里面含有大量的html标签,多浪费宽带呀,你看JQ完全是json格式,尤其linq to json 把数据
封装成匿名对象集合更是完美,是啊 ,的确我也认同这个观点 ,现在可以说是Josn 横行的时代,用json 被认作是
一种时尚 ,可是,数据传到客户端怎样? 把他解析出来邦定到html标记上容易吗?  虽然现在有个叫client  Repeate
r的构造了一个模板表格,然后填充数据时实现数据与标签的分离,但那很死板,你想用个repeater你就得自己写js
代码构造一个,如果项目一大,在开发和维护上都是难以想象的,当然那种方法在显示数据上没一点问题,但是如果要
操作数据呢?例如数据的显示是经过调用服务器方法之后才生成的, 还有分页删除编辑,你能用一个js方法,控制所有的
由众多js组成的数据控件吗 ? 所以这种方式集成性太差,代码的重复使用率不高 ,用json 做品牌行的东西不错
例如:google maps 数据都是json格式,或是做大网站用json也不错,但是就一般这些项目用json 给人感觉就是太浪
漫不切实际,谁都耗不起那种开发量 。再看看XCallback传输数据都是服务器端生成好的html代码,因为它的确有很多
重复的html标签,所以这里启用了服务器端压缩功能,压缩后的代码格式如下:
<div class=a><div class=b></div><div class=c><p><div id=MainData><li class=onpc></li><href=javascript:paging(1)><li class=onpc onmouseover="this.className='onmv'"  onmouseout="this.className='offmv'"  ></a><href=javascript:paging(20)><|>[01]1[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]2[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]3[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]4[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]5[23]网上热议HD90开头假币该版假钞曾流入青岛10:01网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]6[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]7[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]8[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]9[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[2201]10[23]网上热议HD90开头假币该版假钞曾流入青岛10:01[22456]首页[76]上一页[789]下一页[7ab9]末页[7a24]
 以上代码的压缩采用了霍夫曼的思想,他的数据量和linq的匿名对象集合相当,和json格式的数据在量上也差不了
多少,也许现在还有人怀疑启用压缩了那多占服务器资源呀,我当时也有过这种担心,为了放心起见,我做了测试:
运行压缩算法大约用了:1.4毫秒 而执行整个页面用了80毫秒,显然只占了很少一部分,不可能造成性能上的瓶颈
。如果还有一些人对此压缩的性能表示怀疑的话,下面给出了具体代码,你可以看看:
这时后台压缩的主要算法:
int index = -1;
            
string myChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
            source 
= source.Replace("\r\n""").Replace("[""(n!se").Replace("]"")n!se"
);
            System.Text.StringBuilder bulider 
= new
 System.Text.StringBuilder();
            
while ((source.IndexOf(">"!= -1 && source.IndexOf("<"!= -1&& (source.IndexOf(">"> source.IndexOf("<"
)))
            {
                
string str = source.Substring(source.IndexOf("<"), source.IndexOf(">"+ 1 - source.IndexOf("<"
));
                
if (index == 62
)
                    
break
;
                
else

                {
                    bulider.Append(str);
                    index
++;
                    source 
= source.Replace(str, "[" + myChar[index] + "]"
);
                }
            }
            
return bulider.ToString() + "<!3#5|$%+>" + source.Replace(" """).Replace("][""");
 这时前台的js解压算法:
 
  var array = new Array();
        
var stard = new
 Array();
        stard 
= ["0""1",,"Z"
];
        
var SourceHead = source.toString().slice(0, source.toString().indexOf("<!3#5|$%+>"
));
        
var SourceBehind = source.toString().slice(source.toString().indexOf("<!3#5|$%+>"+ 10
);
        array 
= SourceHead.split(">"
);
        
while (SourceBehind.toString().indexOf("]"!= -1
) {
            
for (var i = 0; i < array.length - 1; i++
) {
                SourceBehind 
= SourceBehind.replace("[" + stard[i], "[" + stard[i] + "]["
);
                SourceBehind 
= SourceBehind.replace("[]"""
);
                SourceBehind 
= SourceBehind.replace("[" + stard[i] + "]", array[i] + ">"
);
            }
        }
        
return SourceBehind.replace("(n!se""[").replace(")n!se""]");
事实上XCallback大的bug肯定是没有,你可以放心使用,以前做过几个站用的都是updatepanel ,前几天都转变为
XCallback,网站也没出现异常,为了说明它的可靠性 ,我的一个同学想做个codeless的基于浏览器的编程环境,目
的是可以快速的开发一些插件,程序与后台的通讯的模块很多,为了简化操作我建议他使用了XCallback,这个是他的
codeless编程环境,估计不久就会出炉:
 
 如果大家有好的意见欢迎提出来 这个是XCallback的网站,包含了XCallback的最新程序集和一些示例,希望大家都去看看
http://chenxumi1.vhost015.cn/
 
posted @ 2009-01-12 12:54  地狱伞兵  阅读(2743)  评论(18编辑  收藏  举报