·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> DNN模块开发之利器篇:七种武器

DNN模块开发之利器篇:七种武器

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

DNN模块开发之利器篇:七种武器

2014-04-30 09:08 by DNNTools, ... 阅读, ... 评论, 收藏, 编辑 我们在进行DNN模块开发时经常需要调用Dotnetnuke.dll中的方法函数,模块开发用到DNN的方法函数会让你的开发更加得心应手,下面我们就来介绍一下。1) PortalModuleBase所属命名空间:DotNetNuke.Entities.Modules这是一个开发DNN模块所必须继承的基类,标志性的基类,在此基类中,你可以得到DNN所为你封装的一些模块基本信息,毋需你多费周折,其中包括当前用户UseID,UserInfo,TabID,ModulePath,ModuleConfiguration,LocalResourceFile等等,下边就简单解析几个比较有用的属性: <1> ModulePath: 模块根目录,可以获取到模块根目录所需要的文件,比如脚本文件,图像文件,比如你想在后台注册一个js脚本,代码可以类似:
  1. ScriptManagerscriptManager=ScriptManager.GetCurrent(Page);
  2. scriptManager.Services.Add(newServiceReference(this.ModulePath+"WebService.asmx"));
  3. scriptManager.Scripts.Add(newScriptReference(this.ModulePath+"js/Utility.js"));
<2> LocalResourceFile: 本地化资源文件,默认是关联到模块根目录下的App_LocalResources下对应文件,比如你开发的模块用户控件为xx_view.ascx,那LocalResourceFile就是App_LocalResources/xx_view.ascx.resx(或xx_view.ascx.zh-CN.resx),如果你想手动的注册本地化支持,代码可以类似: lblMessage.Text = Localization.GetString("Message", LocalResourceFile)更高级的应用可能就是设置共享本地化资源,也就是说你可以好些UserControl共享一个资源文件,比如你可以设置一个共享资源文件SharedResources.resx(或SharedResources.zh-CN.resx),专门放置一些公共的本地化键值对设置,然后添加如下方法到你的基类或后台代码,这是一个值得推荐的方法,节省了资源文件的大小(如果说你开发的模块比较复杂的话,文件的统筹规划是必不可少的):
  1. PublicFunctionLocalizationByKey(ByValkeyAsString,OptionalByValIsSharedResourceAsBoolean=False)
  2. IfIsSharedResourceThen
  3. ReturnLocalization.GetString(key,SharedResourceFile)
  4. EndIf
  5. ReturnLocalization.GetString(key,LocalResourceFile)
  6. EndFunction
<3> ModuleConfiguration: 当前用户控件所在的模块配置信息,比如动态设置模块标题,是否显示模块容器,是否支持打印或聚合等等.比如通过以下代码你就可以动态的修改模块标题:
  1. IfNotNull.IsNull(UserId)Then
  2. ModuleConfiguration.ModuleTitle=Localization.GetString("UpdateUserInfo",LocalResourceFile)
  3. Else
  4. ModuleConfiguration.ModuleTitle=Localization.GetString("ModuleTitle",LocalResourceFile)
  5. EndIf
2) Ajax所属命名空间:DotNetNuke.FrameworkDNN核心封装支持Ajax功能的辅助类,其中包含了一些及其有用的方法,比如:IsInstalled(): MS Ajax是否安装IsEnabled(): MS Ajax是否激活RegisterPostBackControl:注册传统PostBack控件RegisterScriptManager: 注册ScriptManager等等.现举一个应用例子:
  1. ///<summary>
  2. ///RegisterthebackgroundWebserviceandjs-script.
  3. ///</summary>
  4. PRivatevoidRegisterAjaxWebservice()
  5. {
  6. if(DotNetNuke.Framework.AJAX.IsInstalled())
  7. {
  8. DotNetNuke.Framework.AJAX.RegisterScriptManager();
  9. ScriptManagerscriptManager=ScriptManager.GetCurrent(Page);
  10. scriptManager.Services.Add(newServiceReference(this.ModulePath+"ManageService.asmx"));
  11. scriptManager.Scripts.Add(newScriptReference(this.ModulePath+"Utility.js"));
  12. }
  13. }
3) ModuleSettingsBase所属命名空间:DotNetNuke.Entities.Modules这是DNN模块设置的基类,其中主要包含两个方法,LoadSettings和UpdateSettings,当你继承于它时,你所需要就是重写这两个基类方法,方法体实现业务逻辑,关联的数据库表为TabModuleSettings或ModuleSettings,这两个都具有同样的数据结构,存储就是类似哈希表的键值对,所不同只是他们更新数据的方法不一样而已:
  1. DimobjModulesAsNewDotNetNuke.Entities.Modules.ModuleController
  2. objModules.UpdateModuleSetting(ModuleId,"timeinterval",txtTimeInterval.Text.Trim.ToString())
  3. DimobjModulesAsNewDotNetNuke.Entities.Modules.ModuleController
  4. objModules.UpdateTabModuleSetting(ModuleId,"timeinterval",txtTimeInterval.Text.Trim.ToString())
而当你仔细参看代码,在方法中LoadSettings所使用的Settings实质就是TabModuleSettings和ModuleSettings的合并,当然你也可以自行获取TabModuleSettings或ModuleSettings,dnn给与你更多的控制权:
  1. PublicShadowsReadOnlyPropertySettings()AsHashtable
  2. Get
  3. If_settingsIsNothingThen
  4. 'MergetheTabModuleSettingsandModuleSettings
  5. _settings=Portals.PortalSettings.GetTabModuleSettings(NewHashtable(ModuleSettings),NewHashtable(TabModuleSettings))
  6. EndIf
  7. Return_settings
  8. EndGet
  9. EndProperty
更多信息你可以参看dnn核心模块,比如Survey,Link等等.我的网站上也有很多DNN模块展示:http://www.dnntools.net/4) CDefault( or PageBase)所属命名空间:DotNetNuke.FrameworkPageBase是DNN核心页面基类,而CDefault是对此有所封装的类,两者何时需要主要看你的开发需要,在此我就分别举两个例子: <1>一般模块中的aspx需要继承PageBase,PageBase主要有LocalResourceFile,PortalSettings等属性,比如你模块中存在一个Print.aspx,后台代码可以如此声明:
  1. PartialPublicClassPrint
  2. InheritsPageBase
  3. EndClass
<2>模块里的用户控件如果需要控制页面信息时,可以新增一个属性BasePage,代码如下:
  1. PublicReadOnlyPropertyBasePage()AsDotNetNuke.Framework.CDefault
  2. Get
  3. ReturnCType(Me.Page,DotNetNuke.Framework.CDefault)
  4. EndGet
  5. EndProperty
这时你就可以在用户控件加载时动态修改页面相关属性,比如Title: Me.BasePage.Title = Me.BasePage.Title & " - " & m_oEntry.Title本站点博客模块就是如此动态设置页面标题的.或你可以直接如此设置:
  1. 'Overridethepagetitle
  2. DimmyPageAsDotNetNuke.Framework.CDefault
  3. myPage=CType(Me.Page,CDefault)
  4. myPage.Title=Localization.GetString("ControlTitle_YourPage",Me.LocalResourceFile)
5) Globals所属命名空间:DotNetNuke.Common这是DNN模块开发用得最多的一个静态类,汇聚了DNN核心最基本的静态方法,如果你有心想开发好模块,好好看看这里边的方法,你会有意想不到的收获.比如:<1>ConvertDataReaderToDataTable:把DataReader转化为DataTable<2>ConvertDataReaderToDataSet:把DataReader转化为DataSet<3>NavigateURL:最经典的DNN导航(跳转)函数<4> SendMail:DNN核心发送邮件方法<5>FriendlyUrl:友好URL重写方法<6>GetFileList:获取DNN站点根目录下文件列表,如果你在用UrlControl你会觉得这个方法是你所必须知道的.等等.6) CBO ( and Null )所属命名空间:DotNetNuke.Common.Utilities这是DNN模块数据层所必备的一个工具类,对此我也曾专题般的讨论过,合理的使用CBO决定你即将开发的模块的命运,比如扩展性,兼容性,维护代价等等.7) DNNClientAPI所属命名空间:DotNetNuke.UI.Utilities这是DNN赫赫有名的一个辅助类,为DNN模块开发客户端脚本和服务器交互起到不可或缺的作用,同时支持本地化使得脚本也真正实现了本地化.最经常使用例如我们需要在点击某一个删除按钮弹出提示信息,如今在DNN模块及其简单,就是一句代码即可:ClientAPI.AddButtonConfirm(cmdAddComment, LocalizationByKey("cmdDeleteCommentMessage"))在此再举一个比较经典的应用范例,有时我们需要在客户获取目标控件并对此操作,可由于asp.net(DNN)在生成页面时已自动生成客户端代码,比如某一TextBox控件screenName最终可能会生成类似dnn_ctr431_QuickLogin_screenName,如果你在客户端脚本中直用document.getElementById('cmdHome')获取该控件的话,只会返回一个undefined或null,这时就需要我们在客户端注册一个页面ID前缀,而DNN早为我们想到了,那就是dnn.js脚本为我们提供两个方法dnn.gerVar和dnn.setVar,具体流程就是首先在页面注册页面前缀:
  1. ClientAPI.RegisterClientReference(this.Page,ClientAPI.ClientNamespaceReferences.dnn);
  2. ClientAPI.RegisterClientVariable(this.Page,"Container_ID",this.ClientID+"_",true);
然后在脚本中你可以直接得到你想要的控件对象:<DIV class="dp-highlighter" id=javascript.
  1. var_ModuleContainer;
  2. if(typeof(_ModuleContainer)=='undefined')_ModuleContainer=dnn.getVar('Container_ID');
  3. varscreenName=$get(_ModuleContainer+'screenName').value;

如果你还不明白,你可以看我的网站,DNN搭建