我正在为DNN 5编写自定义模块,我需要在模块中的每个控件上都有一个“管理”链接。我创建了一个新的UserControl(“ManagerLink”),它继承自PortalModuleBase,将我的链接放入该控件,并将该控件放在所有主要控件上。
问题是ModuleId和TabId在“ManagerLink”嵌套控件中始终为-1。 PortalId工作得很好,我可以通过PortalSettings.ActiveTab.TabID得到一个TabId。
为什么我不能从“ManagerLink”控件中获取ModuleId和TabId,即使它继承自PortalModuleBase?
是否有另一种获取ModuleId的方法(相当于PortalSettings.ActiveTab.TabID)
更新2014年:
刚刚看到另一个答案比原始答案更好(并接受了它)。
如果您使用的是DNN 6及更早版本,请将ModuleBase
替换为PortalModuleBase
答案 0 :(得分:8)
由于子控件继承自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进行任何本地化。
答案 1 :(得分:3)
我只想在这里添加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