在上一篇文章中曾提及在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,无须我们多费周折。
比如实现代码可类似于(仅供参考):
-
-
-
- Public Shared Function EntryWithCommentsViewLink(ByVal tabID As String, _
- ByVal blogID As Integer, _
- ByVal entryID As Integer, _
- ByVal isFriendlyUrl As Boolean, _
- Optional ByVal isPersonalBlog As Boolean = False) As String
- Dim strQuerystring As String = Null.NullString
- If Not HttpContext.Current.Request.Params("BlogID") Is Nothing Then
- strQuerystring += "BlogID=" + HttpContext.Current.Request.Params("BlogID").ToString
- ElseIf Not Null.IsNull(blogID) AndAlso Not isPersonalBlog Then
- strQuerystring += "BlogID=" + blogID.ToString
- End If
- strQuerystring += "&EntryID=" + entryID.ToString
-
- If isFriendlyUrl Then
- strQuerystring += "#Comments"
- Else
- strQuerystring += "&#Comments"
- End If
-
- Return NavigateURL(tabID, "", New String() {strQuerystring})
- End Function
使用方式可以如下:
- If HostSettings.GetHostSetting("UseFriendlyUrls") = "Y" Then
- lnkComments.NavigateUrl = Utility.EntryWithCommentsViewLink(TabId, TargetEntry.BlogID, TargetEntry.EntryID, True, IsPersonalBlog)
- Else
- lnkComments.NavigateUrl = Utility.EntryWithCommentsViewLink(TabId, TargetEntry.BlogID, TargetEntry.EntryID, False, IsPersonalBlog)
- End If
代码还是可以自说明清楚其中的意图,故不再费口舌,关键是构建参数的过程(其实你可以有自己的方式),如果有疑问不妨留言或直接联系,欢迎大家一起交流. :)
2)页面跳转 : 其主要问题是如何得知目标模块所在页面之属性TabID,这是DNN定位每个页面的唯一标识,而这可通过ModuleController类的GetModuleByDefinition获取到,故实现代码类似于:
-
-
-
- ReadOnly Property BlogModuleTabID() As Integer
- Get
- Dim ModuleCtl As New ModuleController
- Dim BlogModuleInfo As ModuleInfo = ModuleCtl.GetModuleByDefinition(PortalId, "View_Blog")
- If Not BlogModuleInfo Is Nothing Then
- Return BlogModuleInfo.TabID
- Else
- Return Null.NullInteger
- End If
- End Get
- End Property
-
-
- Dim TargetLink As String = NavigateURL(BlogModuleTabID, "", "EntryID=" & EntryItem.EntryID.ToString())