使用URL Routing进行数据分页

代码:/Files/zhuqil/DataPagerExtenderSample.zip

介绍:

    ASP.NET3.5中包含了一个非常有用的组件 - DataPager控件.这个控件允许你对任何实现了IPageableItemContainer接口的控件的数据进行分页,例如普遍使用的ListView控件.

  在ASP.NET 4.0 web表单开发中新增了另外一个非常有用的功能:URL Routing,第一次看到是在ASP.NET MVC中,这个路由引擎允许你构建一个有规则的用户友好的URLs,这比URL重写更容易实现.

  可问题是这两种功能不能同时用,DataPager也有其它几个限制

  •在最新的ASP.NET 4.0 beta 2中,当QueryStringField属性被指定后,DataPager根本不能使用.这是一个已经被找出来的bug,在vs2010最终版中才会被处理.但是对于前期的使用者,这仍然是个问题.

  •DataPager只支持查询字符串或者分页的javascript的postback.你不能让当前页的索引来指定。

  •DataPager呈现是可以自定义自己的界面,但是不容易实现,特别是有关CSS样式.

解决方案:

  我的解决方案是写自己的一个分页控件.这个控件像DataPager一样使用IPageableItemContainer接口,但是用了生成不同的用户界面生成的方法.

  控件使用标准的HyperLink控件,通过配置设置NavigateUrl属性,如果没有设置,HyperLink控件将会隐藏或者无效.

  这个控件继承了IPageableItemContainer.

DataPagerExtender控件的属性:

 TargetControlID - 目标分页控件的ID

 PageSize - 一页的大小 - 默认为10

 PageIndexSource - 这个属性能得到当前页码索引. 可以是RouteParameter 也可以是QueryString

 CollectionKey - 设置查询字符串字段或路线参数名称(见上文),以获得当前页的索引的

 InactiveLinkMode-指定当一个link被设置为inactive如何表现(也就是说:"vious"link是为第一页).默认值是Ignore,这种情况下,这个link是被忽视的 和保持不变.当设置为  Hide时,这个特别的link是隐藏的.当设置为Disable,这个控件是无效的.

 FirstLinkID, PreviousLinkID, NextLinkID, LastLinkID - 这些属性指定导航的HyperLink控件的ID,如果你给这些属性空值.它将会被忽略.这样,如果你只想要 "vious" 和"next" links,你只要设定 PreviousLinkIDNextLinkID

使用DataPagerExtender控件

首先,用通常的方式显示你的数据在一个ListView控件上面.然后,添加4个HyperLink控件分别导向第一页, 上一页, 下一页, 和最后一页

代码

 

< asp:ListView  ID ="ListView1"  runat ="server"  DataSourceID ="LinqDataSource1" >
  
< LayoutTemplate >
    
< table >
      
< thead >
        
< tr >
          
< th > ProductID </ th >
          
< th > ProductName </ th >
          
< th > UnitPrice </ th >
        
</ tr >
      
</ thead >
      
< tbody >
        
< asp:PlaceHolder  ID ="itemPlaceholder"  runat ="server"   />
      
</ tbody >
      
< tfoot >
        
< tr >
          
< td  colspan ="3" >
            
< div  style ="float: left" >
              
< asp:HyperLink  ID ="LinkFirst"  runat ="server"  Text ="<< first"   />
              
< asp:HyperLink  ID ="LinkPrevious"  runat ="server"  Text ="< vious"   />
            
</ div >
            
< div  style ="float: right" >
              
< asp:HyperLink  ID ="LinkNext"  runat ="server"  Text ="next >"   />
              
< asp:HyperLink  ID ="LinkLast"  runat ="server"  Text ="last >>"   />
            
</ div >
          
</ td >
        
</ tr >
      
</ tfoot >
  
</ LayoutTemplate >
  
< ItemTemplate >
    
< tr >
      
< td >
        
< asp:Label  runat ="server"  Text ='<%#  Eval("ProductID") % > ' />
      
</ td >
      
< td >
        
< asp:Label  runat ="server"  Text ='<%#  Eval("ProductName") % > ' />
      
</ td >
      
< td >
        
< asp:Label  runat ="server"  Text ='<%#  Eval("UnitPrice") % > ' />
      
</ td >
    
</ tr >
  
</ ItemTemplate >
</ asp:ListView >
< asp:LinqDataSource  ID ="LinqDataSource1"  runat ="server"  TableName ="Products"
                    ContextTypeName
="NorthwindDataContext"  OrderBy ="ProductName"  
                    Select
="new (ProductID, ProductName, UnitPrice)"   />

然后添加DataPagerExtender (在我的案例,我以my为前缀注册它,这里我使用了查询字符串的方式)

 

代码
< my:DataPagerExtender  ID ="DPE1"  runat ="server"  TargetControlID ="ListView1"  
                      PageIndexSource
="QueryString"  CollectionKey ="Page"  
                      FirstLinkID
="LinkFirst"  LastLinkID ="LinkLast"  
                      NextLinkID
="LinkNext"  PreviousLinkID ="LinkPrevious"   />

 

使用DataPagerExtender的路由

首先,你必须稍微修改上面的控件的引用:

 

代码
< my:DataPagerExtender  ID ="DPE1"  runat ="server"  TargetControlID ="ListView1"  
                      PageIndexSource
="RouteParameter"  CollectionKey ="Page"  
                      FirstLinkID
="LinkFirst"  LastLinkID ="LinkLast"  
                      NextLinkID
="LinkNext"  PreviousLinkID ="LinkPrevious"   />

然后,你必须创建一些路由路线,它包含了{Page}的线路参数(可能会更多).这个参数是必要的,默认情况下是‘1’,因此,没有明确的规定第一页的显示.

代码
void  Application_Start( object  sender, EventArgs e) {
    RouteTable.Routes.MapPageRoute(
" PagedProducts " ,      //  route name
         " pagedproducts/{Page} " ,                          //  path
         " ~/Products2.aspx " ,                              //  internal handler
         false ,                                           //  do not check physical file
         new  RouteValueDictionary { {  " Page " " 1 "  } });   //  default to first page
}

 

限制:

相比原始的DataPager控件,我的DataPagerExtender 有几个限制:

•它不支持分页回发。

•只有下一页/上一页等,分页风格,没有一列的数字来支持跳页的功能。

•没有很明显的方式来显示分页信息.

 

原文地址:http://www.codeproject.com/KB/aspnet/paging_with_url_routing.aspx

 


原文链接: http://www.cnblogs.com/zhuqil/archive/2009/12/11/1621884.html

你可能感兴趣的:(使用URL Routing进行数据分页)