我正在使用 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”模块已折叠以及哪个模块已展开。
答案 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
。
我希望它能帮助需要类似东西的每个人。 非常抱歉,我没有发布任何代码,但这是针对客户的实现,不允许我提供给第三方。