2

我正在使用DNN 9.2并寻找创建自己的模块的可能性,该模块将像Atlassian Confluence 的 Expander Macro一样工作,我可以在其中添加其他内容。在我的情况下,我想添加其他模块,如果父级展开则可见,如果父级折叠则隐藏。我想Pane在我的模块中使用一个控件来将其他几个模块放入其中。这是一种模仿Evoq 的 Grid模块功能的方法,但由于尚不存在此类(扩展器)模块,因此还可以折叠和扩展其内容。

我已经尝试通过在方法中添加命名空间中的Pane控件并调用. 正如我在数据库中看到的,通过将其移动到我们的自定义(扩展器)模块中添加的模块与位于我们模块中的窗格相关。实际上我在加载和渲染页面时遇到了一些问题,因为该模块位于我们的自定义模块下而不是在我们的自定义模块中,就像它在数据库中引用的那样。DotNetNuke.UI.SkinsPage_Loadpane.ProcessPane()

以下是我的实际代码:

在 *.ascx 文件中:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="View.ascx.cs" Inherits="Prototype.View" %>

<div ID="TestModuleDiv" runat="server"></div>

在 *.ascx.cs(文件后面的代码)中:

using System;
using System.Web.UI.HtmlControls;
using DotNetNuke.Entities.Modules;
using DotNetNuke.UI.Skins;

protected void Page_Load(object sender, EventArgs e)
{
    var paneName = "MyTestPane" + ModuleContext.ModuleId;

    var paneControl = new HtmlGenericControl("div");
    paneControl.ID = paneName;

    TestModuleDiv.Controls.Add(paneControl);

    var paneId = paneControl.ClientID.Replace("dnn_", "");

    PortalSettings.ActiveTab.Panes.Add(paneId);

    var pane = new Pane(paneId, paneControl);
    pane.ProcessPane();
}

有人有更多信息如何实现我想要的行为吗?

目的是创建一个可以包含其他几个模块的扩展模块,但我们不确定如何以最佳实践方式构建它。

编辑
对不起,我错过了一个事实,即我正在寻找一种最小化 JS 魔法的方法。因此我认为它必须发生在代码后面。
此外,页面必须记住哪个“扩展器”模块被折叠以及哪个扩展。

4

2 回答 2

1

你可能想看看这个开源项目:

   https://github.com/redtempo/dnnstuff.aggregator

这项工作已经完成。

于 2018-07-19T15:08:57.673 回答
0

好吧,我们已经达到了一种可以像我们预期的那样工作的方法。

整个添加/移动模块到扩展器模块中,开箱即用,并自动使用 DNN 自己的功能方面。我们没有什么要额外实现的。

我们创建了一个自己的Panel控件,该控件继承自HtmlContainerControl并具有一些逻辑来使用父外观作为容器,此外还使用父模块从中获取活动选项卡(页面)。这一切都将发生在方法中OnInit。同样在OnInit方法OnInitComplete中注册了方法。在这种方法中,我们将所有(以前添加的)模块移动到窗格中。否则扩展器模块添加的模块不会放在扩展器内部,而是放在它下面。之后,我们必须在活动选项卡中注册我们自己的窗格控件,并最终ProcessPane在窗格上调用。

我希望它能帮助所有需要类似东西的人。我很抱歉没有发布代码,但这是我不允许向第三方提供的客户的实现。

于 2018-10-11T11:31:43.637 回答