Register  |  
About the author
Baldwin's Status
 Contact Me
Baldwin Sun
Senior Developer for dnn solution & founder of SunBlog module...
Blog搜索
相册库
更多照片请查看相册库
最新评论
Rss Feed
feedsky
抓虾
pageflakes
newsgator
哪吒
我们的服务
  • DotNetNuke 咨询
  • Web设计及其模块开发
  • 免费建站
  • 电子商务
  • 开拓市场
我们致力于开发定制的web 2.0 ,所服务的客户主要包括小中型企业,社区俱乐部及其非盈利机构组织。我们将利用开源的DNN作为我们核心的系统机制,更多相关信息...

剖析DNN分页控件

Posted in [DNN模块开发], [杂项] By baldwin

不知道大家是否用过DNN核心自带的分页控件,我想如果用过的话,也许你已碰到类似我将要提到的问题,那就是该分页控件并非像我们所想的那样,利用经典的asp.net框架中的viewstate来响应(postback)用户的操作,它其实是利用一种更为简单的方式: 用url来维护页面参数,这就使得一旦页面回发(postback), 当前页面就会回滚到原始状态,对应的页面参数也会变成初始值,这对于我们来说无疑是痛苦的。也许你不是很清楚这种状况,不妨举个例子看看, 比如你当前页面的url为:http://localhost/dnndev/tabid/65/category/23/default.aspx, 你注意到url里边存在两个参数(tabid和category), 这时如果你在使用DNN核心自带的分页控件,那对应分页控件的页码也许是类似的链接http://localhost/dnndev/tabid/65/currentpage/4/default.aspx, 当你点击该页码时将会跳转到http://localhost/dnndev/tabid/65/currentpage/4/default.aspx,如此一来category/23这参数也随之丢失了。这样的情况在你是纯粹靠拼字符串来激发页面变化的时候更为明显。所以整个页面的URL里边参数都需要考虑如何维护,防止误操作。深入挖掘该分页控件的代码,你会发现参数维护主要是靠QuerystringParams这一属性来维护,一般维护代码如下:
 
  1.  If Not Request.Params("categoryid"Is Nothing Then  
  2.      m_sViewType = "category"  
  3.      m_oCateggory = CategoryController.GetCategory(CType(Request.Params("categoryid"), Integer))   
  4.   
  5.      _Querystring += "categoryid=" & Request.Params("categoryid").ToString()   
  6.  End If  
  7.   
  8.  If Not Request.Params("BlogDate"Is Nothing Then  
  9.      m_dBlogDate = CType(Date.Parse(Request.Params("BlogDate")), Date)   
  10.      _Querystring += "BlogDate=" & m_dBlogDate.ToString()   
  11.      If Not Request.Params("DateType"Is Nothing Then  
  12.          m_sViewType = Request.Params("DateType")   
  13.          _Querystring += "BlogDate=" & m_sViewType   
  14.      End If  
  15.  End If  
  16.     
  17. 'set the QuerystringParams property   
  18. ctlPagingControlBottom.QuerystringParams = Querystring  
我想你也应该猜到了,这其实也是一个拼字符串的过程,更让你难受的需要你考虑到整个页面url有可能包含的参数信息,对于同一页面多个模块这是无法知晓的。故这将是无可避免的Bugs.当然DNN分页控件并非一无是处,至少很好的支持SEO(搜索引擎),编程更简单些,故对于一个页面只有单个模块的话无疑是一种简单方便的选择,就拿本站点的SunBlog模块来说,因为一般页面就包含Blog相关模块,利用DNN分页控件无疑是明智的。不过个人觉得DNN分页控件有点粗糙,可定制性极差,最后独立出来开发一个更轻量级,优化版本(更简洁的HTML代码)的分页控件,它至少符合SunBlog模块的需求了,目前已在Codeplex.com开源http://www.codeplex.com/dnnsuntoolkit,有兴趣者不妨对照着DNN分页控件看看其中区别。使用方式跟DNN分页控件差别不大。
参考链接:
DNN Paging Control使用方法:
http://www.cto20.com/cto20/tabid/647/EntryId/46/DNN-Best-Kept-Secrets-Part-1-DNN-Paging-Control.aspx
DNN Paging Control的缺陷
http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/118/postid/96091/scope/posts/Default.aspx

Comments

Was it good for you, too?Join the discussion » ,but you need to login first before you make comments.