【问题标题】:DotNetNuke: how to count modules in a pane on current pageDotNetNuke:如何计算当前页面窗格中的模块
【发布时间】:2011-06-20 09:16:00
【问题描述】:

有没有办法从当前页面上下文中计数可见的模块特定窗格

我知道理论上我可以编写一个连接的 sql 语句,但是 DotNetNuke 提供了各种支持这种操作的对象。

这是针对 DNN 4 站点的,但非常感谢任何针对 DNN 5 的提示。

即使窗格中是否有任何模块的信息也会有所帮助。

【问题讨论】:

    标签: dotnetnuke


    【解决方案1】:

    您可以使用 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) 
    

    【讨论】:

    • 就是这样!除了解决我的问题,还包含了很多其他有价值的想法。谢谢!
    【解决方案2】:

    如果您想了解当前用户可以看到哪些模块的数量,您需要像 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.PanesDataProvider.GetTabPanes),否则,将其视为"ContentPane"

    【讨论】:

    • 感谢您提供更多信息,尤其是。 PortalSecurity.HasNecessaryPermission!!希望我也能给你一个“接受”,但米卡是第一个并为我解决了基本问题(并且声誉较低;-))。所以必须投赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多