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

我们在进行DNN模块开发时经常需要调用Dotnetnuke.dll中的方法函数,模块开发用到DNN的方法函数会让你的开发更加得心应手,下面我们就来介绍一下。

1)
PortalModuleBase

所属命名空间:DotNetNuke.Entities.Modules

这是一个开发DNN模块所必须继承的基类,标志性的基类,在此基类中,你可以得到DNN所为你封装的一些模块基本信息,毋需你多费周折,其中包括当前用户UseID,UserInfo,TabID,ModulePath,ModuleConfiguration,LocalResourceFile等等,下边就简单解析几个比较有用的属性:

<1> ModulePath:
模块根目录,可以获取到模块根目录所需要的文件,比如脚本文件,图像文件,比如你想在后台注册一个js脚本,代码可以类似:

  1. ScriptManager scriptManager = ScriptManager.GetCurrent(Page);

  2. scriptManager.Services.Add(new ServiceReference(this.ModulePath + "WebService.asmx"));

  3. scriptManager.Scripts.Add(new ScriptReference(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. Public Function LocalizationByKey(ByVal key As String, Optional ByVal IsSharedResource As Boolean = False)

  2. If IsSharedResource Then

  3. Return Localization.GetString(key, SharedResourceFile)

  4. End If
  5. Return Localization.GetString(key, LocalResourceFile)

  6. End Function

<3> ModuleConfiguration:
当前用户控件所在的模块配置信息,比如动态设置模块标题,是否显示模块容器,是否支持打印或聚合等等.比如通过以下代码你就可以动态的修改模块标题:

  1. If Not Null.IsNull(UserId) Then

  2. ModuleConfiguration.ModuleTitle = Localization.GetString("UpdateUserInfo", LocalResourceFile)

  3. Else

  4. ModuleConfiguration.ModuleTitle = Localization.GetString("ModuleTitle", LocalResourceFile)

  5. End If

2)
AJAX

所属命名空间:DotNetNuke.Framework

DNN核心封装支持Ajax功能的辅助类,其中包含了一些及其有用的方法,比如:
IsInstalled(): MS
Ajax是否安装
IsEnabled(): MS
Ajax是否激活
RegisterPostBackControl: 注册传统PostBack控件
RegisterScriptManager:
注册ScriptManager
等等.
现举一个应用例子:

  1. /// <summary>

  2. /// Register the background Webservice and js-script.

  3. /// </summary>

  4. private void RegisterAjaxWebservice()

  5. {

  6. if (DotNetNuke.Framework.AJAX.IsInstalled())

  7. {

  8. DotNetNuke.Framework.AJAX.RegisterScriptManager();
  9. ScriptManager scriptManager = ScriptManager.GetCurrent(Page);

  10. scriptManager.Services.Add(new ServiceReference(this.ModulePath + "ManageService.asmx"));

  11. scriptManager.Scripts.Add(new ScriptReference(this.ModulePath + "Utility.js"));

  12. }

  13. }

3)
ModuleSettingsBase

所属命名空间:DotNetNuke.Entities.Modules

这是DNN模块设置的基类,其中主要包含两个方法,LoadSettings和UpdateSettings,当你继承于它时,你所需要就是重写这两个基类方法,方法体实现业务逻辑,关联的数据库表为TabModuleSettings或ModuleSettings,这两个都具有同样的数据结构,存储就是类似哈希表的键值对,所不同只是他们更新数据的方法不一样而已:

  1. Dim objModules As New DotNetNuke.Entities.Modules.ModuleController

  2. objModules.UpdateModuleSetting(ModuleId, "timeinterval", txtTimeInterval.Text.Trim.ToString())
  3. Dim objModules As New DotNetNuke.Entities.Modules.ModuleController

  4. objModules.UpdateTabModuleSetting(ModuleId, "timeinterval", txtTimeInterval.Text.Trim.ToString())

而当你仔细参看代码,在方法中LoadSettings所使用的Settings实质就是TabModuleSettings和ModuleSettings的合并,当然你也可以自行获取TabModuleSettings或ModuleSettings,dnn给与你更多的控制权:

  1. Public Shadows ReadOnly Property Settings() As Hashtable

  2. Get

  3. If _settings Is Nothing Then

  4. ‘Merge the TabModuleSettings and ModuleSettings

  5. _settings = Portals.PortalSettings.GetTabModuleSettings(New Hashtable(ModuleSettings), New Hashtable(TabModuleSettings))

  6. End If

  7. Return _settings

  8. End Get

  9. End Property

更多信息你可以参看dnn核心模块,比如Survey,Link等等.

我的网站上也有很多DNN模块展示:http://www.dnntools.net/

4) CDefault( or
PageBase)

所属命名空间:DotNetNuke.Framework

PageBase是DNN核心页面基类,而CDefault是对此有所封装的类,两者何时需要主要看你的开发需要,在此我就分别举两个例子:

<1>一般模块中的aspx需要继承PageBase,PageBase主要有LocalResourceFile,PortalSettings等属性,比如你模块中存在一个Print.aspx,后台代码可以如此声明:

  1. Partial Public Class Print

  2. Inherits PageBase

  3. End Class

<2>模块里的用户控件如果需要控制页面信息时,可以新增一个属性BasePage,代码如下:

  1. Public ReadOnly Property BasePage() As DotNetNuke.Framework.CDefault

  2. Get

  3. Return CType(Me.Page, DotNetNuke.Framework.CDefault)

  4. End Get

  5. End Property

这时你就可以在用户控件加载时动态修改页面相关属性,比如Title:

Me.BasePage.Title = Me.BasePage.Title & " - "
& m_oEntry.Title

本站点博客模块就是如此动态设置页面标题的.

或你可以直接如此设置:

  1. ‘Override the page title

  2. Dim myPage As DotNetNuke.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. var screenName = $get( _ModuleContainer + ‘screenName‘).value;

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

DNN模块开发之利器篇:七种武器,布布扣,bubuko.com

时间: 2024-10-25 21:36:00

DNN模块开发之利器篇:七种武器的相关文章

面试官的七种武器:Java篇

起源 自己经历过的面试也不少了,互联网的.外企的,都有.总结一下这些面试的经验,发现面试官问的问题其实不外乎几个大类,玩不出太多新鲜玩意的.细细想来,面试官拥有以下七种武器.恰似古龙先生笔下的武侠世界中的七种武器.下面我为各位一一道来. (欢迎转载.转载请注明出处:http://www.cnblogs.com/hzg1981/) 长生剑=语言基础 长生剑是七种武器之首,同理,编程语言的考察也是技术面试中最基本的.这条不满足的就直接Pass了.以Java为例,语言的考察大致可以分为三个层次: 初级

浏览器端技术体系概览 -- 前端开发的七种武器

科普文一则,说说我对前端技术体系(也称浏览器端技术体系)的认识,希望能让更多人了解前端,也希望能借此丰富前端开发的大局观. 去年我写了网站性能优化系列文章,看过的朋友会知道,这类文章重点并非介绍各种具体的优化技巧,而是在关注发掘这些优化点的思路和方法.然后介绍给大家多种检测手段去发现问题,进而有目标的解决问题.所有这些需要我们对有网页整个生命周期有清晰的认识,对网页中各种技术极其相互结合的方式有明确的认知.这就回归到一个更本质的问题:浏览器端技术体系是怎样的. 想用三言两语说清前端技术不大可能,

对冲基金到底是什么:细数对冲基金的七种武器

古龙小说<七种武器>里,列出了长生剑.孔雀翎.碧玉刀.多情环.离别钩.霸王枪.拳头等七种非一般江湖武器,分别对应着笑.自信心.诚实.仇恨.戒骄.勇气和不放弃. 1 长生剑/宏观(Macro) 许多江湖上最强的高手都是使剑的.许多江湖上最强的高手都是做宏观的. 曾经名满天下的索罗斯的量子基金就是做宏观的,还有比如保罗?琼斯(Paul Jones)的都德期货基金.布鲁斯?科夫纳(Bruce Kovner)的卡克斯顿(Caxton).路易斯?培根(Louis Bacon)的摩尔全球基金等. 宏观对冲

双十一在即,阿里的七种武器

双十一临近,普大喜奔.天猫不是一个人在战斗.阿里十五年来,构建了丰富的产业生态,统称为阿里系.一支穿云箭,千军万马来相见.今天我们就来盘点一下阿里系各路诸侯,将如何助阵? 堪任一方霸主的诸侯,有微博.优酷.UC.菜鸟.支付宝等,共担信息流.资金流.物流的重任,特别是新加盟的微博.优酷.UC,对应着社交流量.视频流量和移动流量.阿里对其投资收购的成效,双十一是一场大考. 古龙大侠的<七种武器>系列实为六种,阿里系诸侯按风格气质,可与其中一种相比. 长生剑:支付不是问题 就看支付宝刷记录的能力了

[转载]项目风险管理七种武器-长生剑

关键词 将长项发挥到极致 “一个人只要懂得利用自己的长处,根本不必用武功也一样能够将人击倒.” 她的长处是笑——无论多么锋利的剑,也比不上那动人的一笑. 古龙最后说:“所以我说的第一种武器,并不是剑,而是笑,只有笑才能真的征服人心.所以当你懂得这道理,就应该收起你的剑来多笑一笑!” 演绎 项目经理最重要的基本功就是制定计划,执行计划.为此,我们就从计划类型的风险管理开始,解读如何将这一工作做到极致.   项目中遇到计划风险,主要涉及下面几个场景: 角色职责:项目组织结构涉及部门较多,项目开发过程

asp网络编程:ASP中实现分页显示的七种武器

在微软的ASP编程体系中,ADO对象的建立,使得从网页访问数据库成为一件易事,特别是ADO的Recordset对象使得控制数据的输出显示更为方便.自由.而在Visual InterDev6.0(以下简称VI6.0)中,由于Script Object Model(以下简称SOM).Design-Time Control(以下简称DTC)以及Data Environment Object Model(以下简称DEOM)等对象模型的引入,使网页对数据库的访问设计显得更为方便. 因为主题方面的原因,关于

PHP7程序猿必备的七种武器

作为一个程序猿(又或者是程序媛),出来闯荡江湖,没有几种必杀技在手,那是肯定无法赢得江湖名声的,除了必杀技之外,武器也是很重要的,但是一把青钢剑,肯定是无法赢得万千少男少女的欢心的.就连小李飞刀,人家也没记住他的帅,只是记得了他的飞刀. 难道不是吗? 本文着重介绍对于程序猿来说,居家旅行编程泡妞的七种必备武器,以及若干实(zhuang)用(bi)必选. 开发环境 最隆重推荐:XAMPP 有win版本.mac版本.linux版本等等,全部都齐备了.标准的英语定义是:XAMPP is an easy

程序员开发学习利器篇(下)之文档资料软件-获取软件、资料的最好途径

以下内容,开发初学者看,熟手略过. 论语有言: 工欲善其事 必先利其器 ,意思是工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工作非常重要. 第二篇我们来说说软件.文档资料.信息获取的高效途径. 首先说句题外话,程序员的软件.资料学习盘 应该是这个样子的: 文件夹视图应该是 详细列表 并且应用到电脑所有文件夹,方便查看文件的全名 最新的修改日期 类型 大小.并且文件显示应该是全名称 包括后缀名,文件目录起名字最好都是英文的,尤其是软件的安装目录,因为有些软件不识别中文的路径.

Tungsten Fabric入门宝典丨TF组件的七种“武器”

Tungsten Fabric入门宝典系列文章,来自技术大牛倾囊相授的实践经验,由TF中文社区为您编译呈现,旨在帮助新手深入理解TF的运行.安装.集成.调试等全流程.如果您有相关经验或疑问,欢迎与我们互动,并与社区极客们进一步交流.更多TF技术文章,请点击公号底部按钮>学习>文章合集. 作者:Tatsuya Naganawa 译者:TF编译组 Tungsten Fabric中有很多不同的组件.接下来我简要描述它们的用法. 概览 总体而言,Tungsten Fabric中包含7种角色和(多达)3