DNN 5 - Não é possível obter o ModuleID atual do controle de usuário aninhado no módulo personalizado
-
22-07-2019 - |
Pergunta
Estou escrevendo um módulo personalizado para o DNN 5 e preciso de um link "Gerenciar" para estar em todos os controle do módulo. Criei um novo UserControl ("Gerenciador") que herda do PortalmoduleBase, coloquei meu link nesse controle e soltei esse controle em todos os meus controles principais.
O problema é que o ModuleID e o Tabid estão sempre -1 no controle aninhado "Gerenciador". O PortalId funciona muito bem, e eu posso obter um Tabid fazendo portalsettings.activeTab.tabid.
Por que não consigo obter o ModuleId e o Tabid no controle "Gerenciador", mesmo que ele herde do PortalmoduleBase?
Existe um método alternativo para obter o ModuleId (equivalente a portalsettings.activetab.tabid)
Atualização 2014:
Acabei de ver outra resposta que é muito melhor que o original (e a aceitou).
Se você estiver usando o DNN 6 e anterior, substitua ModuleBase
com PortalModuleBase
Solução
Eu só queria adicionar meus 2 centavos aqui, usando a resposta de @roman-m e estendendo-se,
Consegui fazer isso no controle aninhado assim:
//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;
}
Isso significa que no Page_Load
Evento do controle aninhado, ele já terá o arquivo de configuração e recursos locais em mãos.
Isso também significa que você não precisa carregar a configuração e o arquivo de recursos locais em todos os controles de pai que usa o controle da criança.
Isso só funcionará quando o pai for do tipo ModuleBase, é claro
E para ser ainda mais específico, isso funciona na versão 7.00.06
Outras dicas
William Severance de Fórum DNN Respondeu a este para mim, postarei a resposta aqui também.
Como o controle da criança herda do PortalmoduleBase, eu faria o seguinte no manipulador de Page_load do controle dos pais
Nota: o gerenciador é considerado uma referência ao controle da criança
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
}
O exposto acima permite que o controle da criança use o ModuleConfiguration do pai (que incluirá o ModuleID) e o LocalResourceFile para qualquer localização.