【问题标题】:How do I create a DNN module which can be placed on the same page multiple times with different content in the settings?如何创建一个 DNN 模块,该模块可以多次放置在同一页面上,并在设置中具有不同的内容?
【发布时间】:2019-02-12 10:46:54
【问题描述】:

我正在创建一个模块,它允许我将 HTML 内容保存在 DNN 模块的设置部分,该模块将存储在门户设置中。

如何确保我的设置仅对于它所在的当前容器是唯一的?如何获取模块所在的当前 div 的 ID?

然后我可以将模块放置在完全相同的位置。例如网站的页眉和页脚部分。

所以,如果我可以获取 ParentDivID,然后将其附加到设置键的末尾。

例如:if (dictSettings.ContainsKey("GlobalHTML" + ParentDivID))

这是我当前的 DNN 模块设置代码隐藏代码

if (Page.IsPostBack == false)
{
    //Updated to use Portal Settings instead of per page per tab settings
    var dictSettings = m_PortalController.GetPortalSettings(PortalId);

    if (dictSettings.ContainsKey("GlobalHTML"))
    {
     txtGlobalHTML.Text = dictSettings["GlobalHTML"];
    }

}

【问题讨论】:

  • 我相信模块的每个实例都有一个唯一的 ID。那将是我要寻找的第一件事。您可以做的另一件事是对页眉、页脚等进行单选,然后根据这些设置设置。

标签: dotnetnuke dnn9


【解决方案1】:

您通常将存储模块设置存储在 ModuleController 的 ModuleSettings 表中。

var modules = new ModuleController();
modules.UpdateTabModuleSetting(TabModuleId, "SettingKey", "SettingValue");

但对于 HTML,我会创建一个自定义表,用于存储带有主键和 TabModuleId 列的 HTML。

【讨论】:

  • 这没有考虑多个门户。还有一个问题是如何区分同一页面上的两个相同模块。
  • 没必要。 ModuleID 始终是唯一的,即使跨门户也是如此。
  • 好的。自从我使用 DNN 以来已经有一段时间了,我只记得在门户网站上遇到了设置问题。
【解决方案2】:

我想出了一种方法,可以将相同的模块添加到特定门户上的页面,并使用我可以设置的 ID 将已保存在设置中的内容链接起来。

因此,如果我想在多个页面或页脚内容上使用相同的电话号码,那么我可以将设置部分中的 HTML 字段留空,并将 ID 设置为与我最初使用 HTML 内容配置的 ID 相同。

这是模块设置加载时的代码:

 if (Page.IsPostBack == false)
 {
  per tab settings
  var dictSettings = m_PortalController.GetPortalSettings(PortalId);

  if (Settings.Contains("GlobalIDHTML"))
  {
  txtIDGlobalHTML.Text = Settings["GlobalIDHTML"].ToString();
  LinkID = Settings["GlobalIDHTML"].ToString();
  }

  if (dictSettings.ContainsKey("GlobalHTML"+ LinkID))
  {
  txtGlobalHTML.Text = dictSettings["GlobalHTML"+ LinkID];                       
  }      
}

这是更新设置的代码:

 public override void UpdateSettings()
 {
  try
     {
      var modules = new ModuleController();
      modules.UpdateModuleSetting(ModuleId, "GlobalIDHTML", txtIDGlobalHTML.Text);
      modules.UpdateTabModuleSetting(TabModuleId, "GlobalIDHTML", txtIDGlobalHTML.Text);
      var globalstoragevalue = "GlobalHTML"+ txtIDGlobalHTML.Text;

      if (txtGlobalHTML.Text != null && !string.IsNullOrWhiteSpace(txtGlobalHTML.Text))
      {
      PortalController.UpdatePortalSetting(PortalId, globalstoragevalue, txtGlobalHTML.Text);
      }
    }
    catch (Exception exc) //Module failed to load
    {
     Exceptions.ProcessModuleLoadException(this, exc);
    }
  }

页面加载时我的代码:

  try
  {
     if (Settings["GlobalIDHTML"] != null && !string.IsNullOrWhiteSpace(Settings["GlobalIDHTML"].ToString()))
    {
    GlobalLinkID = Settings["GlobalIDHTML"].ToString();
    }
    GlobalContent = TryGetPortalSetting("GlobalHTML"+ GlobalLinkID);

    if (GlobalContent != null)
   {
    GlobalPageContent = GlobalContent;
   }                  
  }

模块设置:

结果:

【讨论】:

    【解决方案3】:

    我会看看 HTML 模块是如何做到这一点的......

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 1970-01-01
      • 2017-04-08
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      相关资源
      最近更新 更多