如何创建一个 DNN 模块,它可以多次放置在同一页面上,但设置中的内容不同?

How do I create a DNN module which can be placed on the same page multiple times with different content in the settings?

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

如何确保我的设置仅对放置它的当前容器是唯一的?如何获取模块所在的当前 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"];
    }

}

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

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

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

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

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

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

 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;
   }                  
  }

模块设置:

结果:

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