【发布时间】:2011-06-20 09:16:00
【问题描述】:
有没有办法从当前页面上下文中计数可见的模块特定窗格?
我知道理论上我可以编写一个连接的 sql 语句,但是 DotNetNuke 提供了各种支持这种操作的对象。
这是针对 DNN 4 站点的,但非常感谢任何针对 DNN 5 的提示。
即使窗格中是否有任何模块的信息也会有所帮助。
【问题讨论】:
标签: dotnetnuke
有没有办法从当前页面上下文中计数可见的模块特定窗格?
我知道理论上我可以编写一个连接的 sql 语句,但是 DotNetNuke 提供了各种支持这种操作的对象。
这是针对 DNN 4 站点的,但非常感谢任何针对 DNN 5 的提示。
即使窗格中是否有任何模块的信息也会有所帮助。
【问题讨论】:
标签: dotnetnuke
您可以使用 ModuleController.GetTabModules() 获取 标签中的模块
Imports DotNetNuke.Entities.Modules
...
Dim objModules As New ModuleController
Dim tabModules As Dictionary(Of Integer, ModuleInfo) = objModules.GetTabModules(TabId)
字典的键是 ModuleID,值是 ModuleInfo 对象。也可以调用对应的存储过程GetTabModules获取模块数据。
现在,ModuleInfo 有一个 PaneName 属性,您可以使用该属性将结果分组到另一个字典中,然后从那里检索计数:
Dim result As New Dictionary(Of String, Integer)
For Each tabModule In tabModules.Values
If Not String.IsNullOrEmpty(tabModule.PaneName) Then
result(tabModule.PaneName) += 1
End If
Next
您可能还想过滤掉已删除的模块:
For Each tabModule In tabModules.Values _
.Where(Function(x) Not String.IsNullOrEmpty(x.PaneName)) _
.Where(Function(x) Not x.IsDeleted)
result(tabModule.PaneName) += 1
Next
可以使用存储过程GetTabPanes 检索选项卡的不同窗格名称列表。 4.9.5代码库中对应的方法在DataProvider中实现:
Dim dr As IDataReader = DotNetNuke.Data.DataProvider.Instance().GetTabPanes(TabId)
【讨论】:
如果您想了解当前用户可以看到哪些模块的数量,您需要像 mika 建议的那样调用 ModuleController.GetTabModules,并按 PortalSecurity.HasNecessaryPermission 过滤(或 DNN 5 中的 ModulePermissionController.HasModuleAccess)
var modules = from module in new ModuleController().GetTabModules(TabId).Values
where !module.IsDeleted
&& PortalSecurity.HasNecessaryPermission(SecurityAccessLevel.View, PortalSettings, module)
group module by module.PaneName into paneCounts
select new {
PaneName = paneCounts.Key,
Count = paneCounts.Count(),
};
您可能需要做的另一件事是检查模块的PaneName 是否与当前选项卡上的窗格匹配(通过TabInfo.Panes 或DataProvider.GetTabPanes),否则,将其视为"ContentPane"。
【讨论】: