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

时间:2018-07-18 18:26:00

标签: c# dotnetnuke expander dotnetnuke-9 dnn-module

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

我已经尝试通过在Pane方法中从DotNetNuke.UI.Skins命名空间添加Page_Load控件并调用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”模块已折叠以及哪个模块已展开。

2 个答案:

答案 0 :(得分:1)

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

<object id="pdfBox" data="media/pdf1/pdf1.pdf#toolbar=0" type="application/pdf" style="padding-right:75px; height: 100vh;width: 100%;">
   <p>Alternative text - include a link <a href="media/pdf1/pdf1.pdf">to the PDF!</a></p>
</object>

工作已经完成。

答案 1 :(得分:0)

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

整个添加/移动模块到扩展器模块中都是开箱即用的,并且会自动与DNN自身的功能配合使用。我们没有其他实现。

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

我希望它能帮助需要类似东西的每个人。 非常抱歉,我没有发布任何代码,但这是针对客户的实现,不允许我提供给第三方。