我们在进行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模块开发之利器篇:七种武器的更多相关文章

  1. 面试官的七种武器:Java篇

    起源 自己经历过的面试也不少了,互联网的.外企的,都有.总结一下这些面试的经验,发现面试官问的问题其实不外乎几个大类,玩不出太多新鲜玩意的.细细想来,面试官拥有以下七种武器.恰似古龙先生笔下的武侠世界 ...

  2. 快速开发平台分享-UCML快速开发七种武器

    传统的快速开发平台强调的是组件重用.构件重用,主要解决功能重用层面,一般提供了软件开发最常用的功能:表单设计.BPM(业务流程管理).报表.组织机构及权限等功能.但只有功能重用,没有过程重用,要么只能 ...

  3. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  4. UNIX/Linux C 程序员需要掌握的七种武器

    我是一名普通的软件工程师,不是什么技术大牛.这篇文章所提到的"七种武器"只是我这些年工作经验的一点体会和感悟,如果有错误的地方,还请大家指正. (一)C语言 作为一名C程序员,熟练 ...

  5. 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)

    让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett   译文出处:linux中国-Hank Chow    检查你的代码的质 ...

  6. 百度云世界里的“七种武器”:PCS、BAE、Site App、ScreenX等

    如果说去年百度世界的关键词是“百度新首页”的话,那么今年在研发者人群中,对百度世界最深的印象就是“七种武器”,即在云的世界里,百度为开发者所提供的包括个人云存储.LBS.移动云测试中心等在内的七种工具 ...

  7. ansible七种武器和json

                                                               ansible七种武器和json • 第一种武器 – ansible 命令,用于执 ...

  8. PHP程序猿必备的七种武器

    作为一个程序猿(又或者是程序媛),出来闯荡江湖,没有几种必杀技在手,那是肯定无法赢得江湖名声的,除了必杀技之外,武器也是很重要的,但是一把青钢剑,肯定是无法赢得万千少男少女的欢心的.就连小李飞刀,人家 ...

  9. [转] 前端开发利器--Brackets 的七种武器和旁门左道

    转自:http://www.jianshu.com/p/ff7798aa4548 Brackets是Adobe开发的web编辑器,是一款免费开源.多平台支持的软件,并在于GitHub上维护.Brack ...

随机推荐

  1. Win7 64位 php-5.5.13+Apache 2.4.9+mysql-5.6.19 配置

    一 :准备阶段 1:php php-5.5.13下载链接:http://windows.php.net/downloads/releases/php-5.5.13-Win32-VC11-x64.zip ...

  2. RUBY,玩玩~~~

    我觉得吧,这东瀛的红宝石,也得玩玩,毕竟,RUBY ON RAILS,PUPPET等也是一股力量. 作为混IT圈的,知道总没坏处. 就是感觉和C,C++,JAVA,C#,PHP,甚至PYTHON的感觉 ...

  3. Android 4.0 新增的显示数据集的桌面控件

    setRemoteAdapter (int viewId, Intent intent):该方法可以使用 Intent 更新 RemoteViews 中viewId 对应的组件. 上面方法的 Inte ...

  4. 使用 FreeMarker 替换 JSP 的 10 个理由

    你还在使用 Java 服务器页面(俗称JSP)吗?我曾经也是,但是几年前我抛弃了它们,并且再也没有用过JSP了.JSP 是个很好的概念,但是它却剥夺了 web 开发的乐趣. 对我而言,这些都是小事,比 ...

  5. 10个提升iOS开发效率的必用工具

    Xcode插件 几乎所有开发者都知道Alcatraz是一个开源的包管理工具,可以让我们更轻松地管理各种插件.接下来就介绍下我的最推荐的10个插件: 10.HOStringSense 在编辑字符串的时候 ...

  6. otl获得sql出错位置(oracle)

    项目的一个需要,要获得sql出错的位置,从而给出类似sqlplus的错误提示(如下) sql出错原因易获得,记录在otl_exception::msg,但出错位置就不是那么容易了. 默认情况下otl异 ...

  7. Windows平台下,Scrapy Installation,安装问题解决

    按理说直接:pip install scrapy 就可以成功,但是出现了错误"libxml/xpath.h: No such file or directory" "er ...

  8. Android---优化下载让网络访问更高效(三)

    批处理传输和连接 每次启动一个连接---跟传输的数据大小无关---在使用典型的3G无线信号时,就会潜在的导致无线信号消耗近20秒的电量. 如果一个应用程序每隔20秒ping一次服务器,只是告知该应用程 ...

  9. centos系统安装中文字体几种方法

    我们知道centos是基于linux内核的这款系统默认是不带中文字体了,如果我们要使用中文字体就需要自行安装了,下面一起来看看吧.   前天有用户反应,生成的报到单中他的名字少了一个字.仔细检查了一下 ...

  10. Android Toast 自定义

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...