博客园原文地址 : 学习之模块架构 DotNetNuke 6
这篇博客主要是讲模块的架构和加载,以及模块与DotNetNuke门户网站(Portals)系统的关系。充分了解模块可以帮助DNN开发者根据需要更清晰的构建模块。
在DNN中,模块是一个可插入的用户接口组件,用来处理请求并生成动态的内容。它只能出现在ASP.NET页面上,而页面可以包括任意数量的模块"实例"。
整个模块架构包括四个部分 : 门户网站(Portal),页面(Tab),模块(Module)和模块容器(Container)。
- 门户网站(Portal)
图一 : Portal的基本架构
第一步: 页面配置检索(Page Configuration Retrieval)
//Default.aspx.cs//OnInit//load skin control and register UI js UI.Skins.Skin ctlSkin = UI.Skins.Skin.GetSkin(this); //add skin to page SkinPlaceHolder.Controls.Add(ctlSkin); //DotNetNuke.UI.Skins.Skin.cs : OnInit() bool success; //Load the Module Control(s) success = Globals.IsAdminControl() ? ProcessSlaveModule() : ProcessMasterModules(); //DotNetNuke.UI.Skins.Skin.cs : ProcessMasterModules() bool success = true; if (TabPermissionController.CanViewPage()) { //check portal expiry date if (!CheckExpired()) { if ((PortalSettings.ActiveTab.StartDate < DateAndTime.Now && PortalSettings.ActiveTab.EndDate > DateAndTime.Now) || TabPermissionController.CanAdminPage() || Globals.IsLayoutMode()) { //dynamically populate the panes with modules if (PortalSettings.ActiveTab.Modules.Count > 0) { foreach (ModuleInfo objModule in PortalSettings.ActiveTab.Modules) { success = ProcessModule(objModule); } }
第二步: 安全审计(Security Audit)
private Boolean ProcessModule(ModuleInfo module) { bool success = true; if (ModulePermissionController.CanViewModule(module) && module.IsDeleted == false && ((module.StartDate < DateTime.Now && module.EndDate > DateTime.Now) || Globals.IsLayoutMode() || Globals.IsEditMode())) { //... } //... }
第三步:内容注入(Content Injection)
Pane pane = GetPane(module); if (pane != null) { success = InjectModule(pane, module); }
- 页面(Tab)
图二:页面组件
- 模块(Module)
因为每个模块都生成自己的标记,所以可以将模块视为较大应用程序中的微型应用程序。通常,用户通过单击链接或者提交表单(所提交的表单由门户网站系统及传递给相应模块的命令处理)与每个模块生成的内容交互。
- 模块容器(Container)
图三示范了一个HTML模块在用户以编辑特权登录时的模块容器。这个模块容器包含许多项,例如拥有一列管理选项的悬浮菜单、模块的标题。
图三:模块容器