user-controls - crear - user control c# ejemplo
DNN 5: no se puede obtener el ModuleId actual del control de usuario anidado en el módulo personalizado (2)
William Severance del foro DNN me contestó esta, también publicaré la respuesta aquí.
Como el control secundario hereda de PortalModuleBase, haría lo siguiente en el controlador Page_Load del control principal
Nota: Se supone que ManagerLink es una referencia al control infantil
VB.NET:
With ManagerLink
.ModuleConfiguration = Me.ModuleConfiguration
.LocalResourceFile = Me.LocalResourceFile
End With
DO#:
protected void Page_Load(System.Object sender, System.EventArgs e)
{
ManagerLink.ModuleConfiguration = this.ModuleConfiguration;
ManagerLink.LocalResourceFile = this.LocalResourceFile
}
Lo anterior le permite al control secundario usar ModuleConfiguration de los padres (que incluirá ModuleId) y LocalResourceFile para cualquier localización.
Estoy escribiendo un módulo personalizado para DNN 5, y necesito un enlace "Administrar" para estar en cada control en el módulo. Creé un nuevo UserControl ("ManagerLink") que hereda de PortalModuleBase, puse mi enlace en ese control y dejé ese control en TODOS MIS CONTROLES PRINCIPALES.
El problema es que ModuleId y TabId son siempre -1 en el control anidado "ManagerLink". PortalId funciona bien y puedo obtener una TabId haciendo PortalSettings.ActiveTab.TabID.
¿Por qué no puedo obtener ModuleId y TabId desde el control "ManagerLink", aunque herede de PortalModuleBase?
¿Hay algún método alternativo para obtener ModuleId (equivalente a PortalSettings.ActiveTab.TabID)?
ACTUALIZACIÓN 2014:
Acabo de ver otra respuesta que es mucho mejor que la original (y la acepté).
Si está utilizando DNN 6 y ModuleBase
anteriores, reemplace ModuleBase
con PortalModuleBase
Solo quería agregar mis 2 centavos aquí, usando la respuesta de @ roman-m y extendiéndolo,
Pude hacerlo en el control anidado mismo así:
//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;
}
Esto significa que en el evento Page_Load
del control anidado ya tendrá a mano la configuración y el archivo de recursos locales.
También significa que no tiene que cargar la configuración y el archivo de recursos locales en cada control principal que use el control secundario.
Esto solo funcionará cuando el padre sea de tipo ModuleBase por supuesto
Y para ser aún más específico, esto funciona en la versión 7.00.06