【问题标题】:Custom module with possibility to add modules into module to create an expander module in DNN 9.2自定义模块,可以将模块添加到模块中以在 DNN 9.2 中创建扩展模块
【发布时间】:2018-07-18 18:25:59
【问题描述】:

​我正在使用 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 魔法的方法。因此,我认为它必须发生在代码后面。
此外,页面必须记住哪个“扩展器”模块被折叠,哪个模块被展开。

【问题讨论】:

  • 不确定您要什么,但是使用 Bootstrap 折叠呢?
  • 好的,我可以澄清哪些问题是开放的。目的是让一个模块可以包含多个其他模块。类似于皮肤中的容器,它也可以包含多个模块,但我希望它在一个模块中折叠和展开。
  • 你以前知道你会使用哪些模块吗?
  • 不,应该可以将每个 DNN 中安装的模块添加到我们的自定义模块中。
  • 您打算如何添加这些模块?你也知道你可以添加的最大数量吗?

标签: c# expander dotnetnuke-9 dotnetnuke


【解决方案1】:

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

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

工作已经完成。

【讨论】:

  • 很抱歉我的回复晚了,但是在深入研究之后,这不是我们所期望的。它包含几个 JS 逻辑,我们想要一个完全没有 JS 的解决方案。但是非常感谢您的方法!
【解决方案2】:

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

整个添加/移动模块到扩展器模块中,开箱即用,并自动与 DNN 自己的功能端一起工作。我们没有额外的实现。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多