DNN 5 - Не удается получить текущий ModuleId из вложенного пользовательского элемента управления в пользовательском модуле - PullRequest
7 голосов
/ 14 марта 2009

Я пишу пользовательский модуль для DNN 5, и мне нужна ссылка «Управление», чтобы быть на каждом элементе управления в модуле. Я создал новый UserControl ("ManagerLink"), который наследуется от PortalModuleBase, поместил свою ссылку в этот элемент управления и удалил этот элемент управления на ВСЕ МОИ ОСНОВНЫЕ ОРГАНЫ УПРАВЛЕНИЯ.

Проблема в том, что ModuleId и TabId всегда равны -1 во вложенном элементе управления «ManagerLink». PortalId работает просто отлично, и я могу получить TabId, выполнив PortalSettings.ActiveTab.TabID.

  1. Почему я не могу получить ModuleId и TabId из элемента управления "ManagerLink", даже если он наследуется от PortalModuleBase?

  2. Есть ли альтернативный метод для получения ModuleId (эквивалент PortalSettings.ActiveTab.TabID)

ОБНОВЛЕНИЕ 2014:

Просто увидел другой ответ, который намного лучше оригинала (и принял его).

Если вы используете DNN 6 и более ранние версии, замените ModuleBase на PortalModuleBase

Ответы [ 2 ]

8 голосов
/ 16 марта 2009

Уильям Северанс из Форум DNN ответил на этот вопрос для меня, я также выложу ответ здесь.

Поскольку дочерний элемент управления наследуется от PortalModuleBase, я бы сделал следующий в обработчике Page_Load родительский контроль

Примечание: ManagerLink считается ссылкой на дочерний элемент управления

VB.NET:

With ManagerLink
    .ModuleConfiguration = Me.ModuleConfiguration
    .LocalResourceFile = Me.LocalResourceFile
End With
C #:
protected void Page_Load(System.Object sender, System.EventArgs e)
{
    ManagerLink.ModuleConfiguration = this.ModuleConfiguration;
    ManagerLink.LocalResourceFile = this.LocalResourceFile
}

Вышеприведенный код позволяет дочернему элементу управления использовать ModuleConfiguration (который будет включать ModuleId) и LocalResourceFile для любой локализации.

3 голосов
/ 27 мая 2013

Я просто хотел добавить свои 2 цента здесь, используя ответ @ roman-m и расширив его,

Я смог сделать это в самом вложенном элементе управления так:

//fires first in the sequence, calling initialise components
override protected void OnInit(EventArgs e)
{
    InitializeComponent();
    base.OnInit(e);
}

private void InitializeComponent()
{
    this.Load += new System.EventHandler(this.Page_Load);
    //this binds a handler to the parent's init event
    this.Parent.Init += new EventHandler(this.Parent_Init);
}
//the handler gets called, at this point we can cast the parent as a module base
//and load the configuration and resource file into the nested control
private void Parent_Init(object sender, System.EventArgs e)
{
    this.ModuleConfiguration = ((ModuleBase)this.Parent).ModuleConfiguration;
    this.LocalResourceFile = ((ModuleBase)this.Parent).LocalResourceFile;
}

Это означает, что в событии Page_Load вложенного элемента управления у него уже будет файл конфигурации и файл локальных ресурсов.

Это также означает, что вам не нужно загружать конфигурацию и файл локальных ресурсов в каждый родительский элемент управления, который использует дочерний элемент управления.

Это будет работать, только если родительский объект имеет тип ModuleBase, конечно

И, если быть более точным, это работает в версии 7.00.06

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...