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代码], [DNN模块开发] By baldwin

在上一篇文章中曾提及在DNN模块开发中传参的两种方式,其中包括ASP.NET中经典的URL传参方式,然而尽管如此,对于一些DNN初学者来说还是无从下手,这里我就简单解析其中道理及其如何在页面跳转,模块交互过程中最有效地传递参数,从而达到解除DNN之枷锁的功效。
首先,不妨先归纳一下传参所涉及的问题,追本溯源,找出我们需要面对的及其解决方案,问题主要有:
1)如何响应某一模块的事件( 比如点击或其他类似事件),另一模块对此作相应的加载动作或变化,比如点击A模块的树形节点,B模块加载不同的内容,文章模块就可能如此操作流程。
2)如何响应某一点击事件跳转到对应模块所在页面并传递所需之参数?比如首页最新Blog模块就需要链接到详细内容页面。
那为何初学者会觉得千头万绪呢? 究其原因,主要是由于对DNN一些核心API理解不够透彻而导致,实际上所列举的问题主要可借助NavigateURL,EditURL等核心辅助API方法得以实现的,
关于NavigateURL,EditURL,介绍的资料不少,有兴趣者不妨看看:
接下里让我们来解决以上提到的问题:
1)模块交互:其解决方案可通过NavigateURL来完成,考察NavigateURL重载的方法,其较为优雅的方式当推:
Public Function NavigateURL(ByVal TabID As Integer, ByVal ControlKey As String, ByVal ParamArray AdditionalParameters() As String) As String
也就是该重载方法允许我们传递一个数组样式的参数表,只要我们按照规定的标准构建出来,那NavigateURL会自动帮助我们附加参数到URL,无须我们多费周折。
比如实现代码可类似于(仅供参考):
 
  1. ''' <summary>   
  2. '''  Get the view link of Entry together with Comments archors tags   
  3. ''' </summary>   
  4. Public Shared Function EntryWithCommentsViewLink(ByVal tabID As String, _   
  5.                                                  ByVal blogID As Integer, _   
  6.                                                  ByVal entryID As Integer, _   
  7.                                                  ByVal isFriendlyUrl As Boolean, _   
  8.                               Optional ByVal isPersonalBlog As Boolean = FalseAs String  
  9.     Dim strQuerystring As String = Null.NullString   
  10.     If Not HttpContext.Current.Request.Params("BlogID"Is Nothing Then  
  11.         strQuerystring += "BlogID=" + HttpContext.Current.Request.Params("BlogID").ToString   
  12.     ElseIf Not Null.IsNull(blogID) AndAlso Not isPersonalBlog Then  
  13.         strQuerystring += "BlogID=" + blogID.ToString   
  14.     End If  
  15.     strQuerystring += "&EntryID=" + entryID.ToString   
  16.   
  17.     If isFriendlyUrl Then  
  18.         strQuerystring += "#Comments"  
  19.     Else  
  20.         strQuerystring += "&#Comments"  
  21.     End If  
  22.   
  23.     Return NavigateURL(tabID, ""New String() {strQuerystring})   
  24. End Function  
使用方式可以如下:
 
  1. If HostSettings.GetHostSetting("UseFriendlyUrls") = "Y" Then  
  2.     lnkComments.NavigateUrl = Utility.EntryWithCommentsViewLink(TabId, TargetEntry.BlogID, TargetEntry.EntryID, True, IsPersonalBlog)   
  3. Else  
  4.     lnkComments.NavigateUrl = Utility.EntryWithCommentsViewLink(TabId, TargetEntry.BlogID, TargetEntry.EntryID, False, IsPersonalBlog)   
  5. End If  
代码还是可以自说明清楚其中的意图,故不再费口舌,关键是构建参数的过程(其实你可以有自己的方式),如果有疑问不妨留言或直接联系,欢迎大家一起交流.  :)
2)页面跳转 : 其主要问题是如何得知目标模块所在页面之属性TabID,这是DNN定位每个页面的唯一标识,而这可通过ModuleController类的GetModuleByDefinition获取到,故实现代码类似于:
 
  1. '''    
  2. ''' get the tabid of the detail entry page, which the module(Definition:View_Blog) exist   
  3. '''    
  4. ReadOnly Property BlogModuleTabID() As Integer  
  5.     Get  
  6.         Dim ModuleCtl As New ModuleController   
  7.         Dim BlogModuleInfo As ModuleInfo = ModuleCtl.GetModuleByDefinition(PortalId, "View_Blog")   
  8.         If Not BlogModuleInfo Is Nothing Then  
  9.             Return BlogModuleInfo.TabID   
  10.         Else  
  11.             Return Null.NullInteger   
  12.         End If  
  13.     End Get  
  14. End Property  
  15.   
  16. 'get the target page's url   
  17. Dim TargetLink As String = NavigateURL(BlogModuleTabID, """EntryID=" & EntryItem.EntryID.ToString())  

Comments

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