自定义模块,可以将模块添加到模块中以在 DNN 9.2 中创建扩展模块

Custom module with possibility to add modules into module to create an expander module in DNN 9.2

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

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

以下是我的实际代码:

在*.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 魔力的方法。因此我认为它必须发生在代码后面。
此外,页面必须记住哪个 "expander" 模块被折叠,哪个模块被展开。

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

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

工作已经完成。

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

扩展器模块中的整个 adding/moving 模块开箱即用,并自动与 DNN 自身的功能一起使用。我们没有什么可以额外实现的。

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

希望对有类似需求的大家有所帮助。 非常抱歉没有发布任何代码,但这是我不允许向第三方提供的客户实现。