﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Baldwin's DNN</title>
    <description>在此研究DNN的所有相关课题，希望给DNN在中国的广为人知贡献一点绵薄之力....</description>
    <link>http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/blogid/1/Default.aspx</link>
    <language>zh-CN</language>
    <managingEditor>dnnsun@gmail.com</managingEditor>
    <webMaster>dnnsun@gmail.com</webMaster>
    <pubDate>Wed, 07 Jan 2009 11:46:44 GMT</pubDate>
    <lastBuildDate>Wed, 07 Jan 2009 11:46:44 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>SunBlog RSS Generator Version 2.1.0.0</generator>
    <item>
      <title>DNN模块开发之利器篇:七种武器</title>
      <description>&lt;div&gt;读过武侠小说的你一定都知道古龙曾有一部著名的小说&amp;lt;&amp;lt;&lt;u&gt;&lt;strong&gt;七种武器&lt;/strong&gt;&lt;/u&gt;&amp;gt;&amp;gt;,其中列举了当今武林最牛的,杀伤力最大的武器,其中包括&lt;em&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;长生剑、孔雀翎、碧玉刀、多情环、霸王枪、离别钩、拳头&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;.后来还有百晓生的兵器排行榜,其中就包括小李飞刀等等.在此我就班门弄斧了,借着古代利器之说,姑且列举一些对DNN模块开发起决定作用的一些方法或类,并辅助说明使用方式(排名没有先后之分,纯粹用于标识):&lt;/div&gt;
&lt;div&gt;&lt;font color="#ff9900"&gt;&lt;strong&gt;1) PortalModuleBase&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;所属命名空间:DotNetNuke.Entities.Modules&lt;/div&gt;
&lt;div&gt;这是一个开发DNN模块所必须继承的基类,标志性的基类,在此基类中,你可以得到DNN所为你封装的一些模块基本信息,毋需你多费周折,其中包括当前用户UseID,UserInfo,TabID,ModulePath,ModuleConfiguration,LocalResourceFile等等,下边就简单解析几个比较有用的属性:&lt;/div&gt;
&lt;div&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;1&amp;gt; ModulePath: 模块根目录,可以获取到模块根目录所需要的文件,比如脚本文件,图像文件,比如你想在后台注册一个js脚本,代码可以类似:&amp;#160;&amp;#160;&amp;#160;
&lt;div&gt;
&lt;div class="dp-highlighter" id="c#"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;ScriptManager&amp;#160;scriptManager&amp;#160;=&amp;#160;ScriptManager.GetCurrent(Page); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;scriptManager.Services.Add(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;#160;ServiceReference(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;.ModulePath&amp;#160;+&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"WebService.asmx"&lt;/span&gt;&lt;span&gt;)); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;scriptManager.Scripts.Add(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;#160;ScriptReference(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;.ModulePath&amp;#160;+&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"js/Utility.js"&lt;/span&gt;&lt;span&gt;));&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;link href="/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/plugins/highlighter/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;2&amp;gt; LocalResourceFile: 本地化资源文件,默认是关联到模块根目录下的App_LocalResources下对应文件,比如你开发的模块用户控件为xx_view.ascx,那LocalResourceFile就是App_LocalResources/xx_view.ascx.resx(或xx_view.ascx.zh-CN.resx),如果你想手动的注册本地化支持,代码可以类似:&lt;/div&gt;
&lt;div&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lblMessage.Text = Localization.GetString("Message", LocalResourceFile)&lt;/div&gt;
&lt;div&gt;更高级的应用可能就是设置共享本地化资源,也就是说你可以好些UserControl共享一个资源文件,比如你可以设置一个共享资源文件SharedResources.resx(或SharedResources.zh-CN.resx),专门放置一些公共的本地化键值对设置,然后添加如下方法到你的基类或后台代码,这是一个值得推荐的方法,节省了资源文件的大小(如果说你开发的模块比较复杂的话,文件的统筹规划是必不可少的):&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="vb"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-vb"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Function&lt;/span&gt;&lt;span&gt;&amp;#160;LocalizationByKey(&lt;/span&gt;&lt;span class="keyword"&gt;ByVal&lt;/span&gt;&lt;span&gt;&amp;#160;key&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;As&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;String&lt;/span&gt;&lt;span&gt;,&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Optional&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;ByVal&lt;/span&gt;&lt;span&gt;&amp;#160;IsSharedResource&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;As&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Boolean&lt;/span&gt;&lt;span&gt;&amp;#160;=&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;False&lt;/span&gt;&lt;span&gt;) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;If&lt;/span&gt;&lt;span&gt;&amp;#160;IsSharedResource&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Then&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Return&lt;/span&gt;&lt;span&gt;&amp;#160;Localization.GetString(key,&amp;#160;SharedResourceFile) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;If&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Return&lt;/span&gt;&lt;span&gt;&amp;#160;Localization.GetString(key,&amp;#160;LocalResourceFile) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Function&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;3&amp;gt; ModuleConfiguration: 当前用户控件所在的模块配置信息,比如动态设置模块标题,是否显示模块容器,是否支持打印或聚合等等.比如通过以下代码你就可以动态的修改模块标题:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="vb"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-vb"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;If&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Not&lt;/span&gt;&lt;span&gt;&amp;#160;Null.IsNull(UserId)&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Then&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ModuleConfiguration.ModuleTitle&amp;#160;=&amp;#160;Localization.GetString(&lt;/span&gt;&lt;span class="string"&gt;"UpdateUserInfo"&lt;/span&gt;&lt;span&gt;,&amp;#160;LocalResourceFile) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;Else&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ModuleConfiguration.ModuleTitle&amp;#160;=&amp;#160;Localization.GetString(&lt;/span&gt;&lt;span class="string"&gt;"ModuleTitle"&lt;/span&gt;&lt;span&gt;,&amp;#160;LocalResourceFile) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;If&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;font color="#ff9900"&gt;&lt;strong&gt;2) AJAX&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;所属命名空间:DotNetNuke.Framework&lt;/div&gt;
&lt;div&gt;DNN核心封装支持Ajax功能的辅助类,其中包含了一些及其有用的方法,比如:&lt;br /&gt;
IsInstalled(): MS Ajax是否安装&lt;br /&gt;
IsEnabled(): MS Ajax是否激活&lt;br /&gt;
RegisterPostBackControl:&lt;strong&gt; &lt;/strong&gt;注册传统PostBack控件&lt;br /&gt;
RegisterScriptManager: 注册ScriptManager&lt;br /&gt;
等等.&lt;br /&gt;
现举一个应用例子:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="c#"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;///&amp;#160;&amp;lt;summary&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span class="comment"&gt;///&amp;#160;Register&amp;#160;the&amp;#160;background&amp;#160;Webservice&amp;#160;and&amp;#160;js-script &lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="comment"&gt;///&amp;#160;&amp;lt;/summary&amp;gt; &lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;#160;RegisterAjaxWebservice() &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{ &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;&amp;#160;(DotNetNuke.Framework.AJAX.IsInstalled()) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{ &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;DotNetNuke.Framework.AJAX.RegisterScriptManager(); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ScriptManager&amp;#160;scriptManager&amp;#160;=&amp;#160;ScriptManager.GetCurrent(Page); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;scriptManager.Services.Add(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;#160;ServiceReference(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;.ModulePath&amp;#160;+&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"ManageService.asmx"&lt;/span&gt;&lt;span&gt;)); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;scriptManager.Scripts.Add(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;#160;ScriptReference(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;.ModulePath&amp;#160;+&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"Utility.js"&lt;/span&gt;&lt;span&gt;)); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;} &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;}&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font color="#ff9900"&gt;3) ModuleSettingsBase&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;所属命名空间:DotNetNuke.Entities.Modules&lt;/div&gt;
&lt;div&gt;这是DNN模块设置的基类,其中主要包含两个方法,LoadSettings和UpdateSettings,当你继承于它时,你所需要就是重写这两个基类方法,方法体实现业务逻辑,关联的数据库表为TabModuleSettings或ModuleSettings,这两个都具有同样的数据结构,存储就是类似哈希表的键值对,所不同只是他们更新数据的方法不一样而已:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="vb"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-vb"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;Dim&lt;/span&gt;&lt;span&gt;&amp;#160;objModules&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;As&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;New&lt;/span&gt;&lt;span&gt;&amp;#160;DotNetNuke.Entities.Modules.ModuleController &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;objModules.UpdateModuleSetting(ModuleId,&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"timeinterval"&lt;/span&gt;&lt;span&gt;,&amp;#160;txtTimeInterval.Text.Trim.ToString()) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span class="keyword"&gt;Dim&lt;/span&gt;&lt;span&gt;&amp;#160;objModules&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;As&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;New&lt;/span&gt;&lt;span&gt;&amp;#160;DotNetNuke.Entities.Modules.ModuleController &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;objModules.UpdateTabModuleSetting(ModuleId,&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"timeinterval"&lt;/span&gt;&lt;span&gt;,&amp;#160;txtTimeInterval.Text.Trim.ToString())&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;而当你仔细参看代码,在方法中LoadSettings所使用的Settings实质就是TabModuleSettings和ModuleSettings的合并,当然你也可以自行获取TabModuleSettings或ModuleSettings,dnn给与你更多的控制权:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="vb"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-vb"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Shadows&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;ReadOnly&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Property&lt;/span&gt;&lt;span&gt;&amp;#160;Settings()&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;As&lt;/span&gt;&lt;span&gt;&amp;#160;Hashtable &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Get&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;If&lt;/span&gt;&lt;span&gt;&amp;#160;_settings&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Is&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Nothing&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Then&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="comment"&gt;'Merge&amp;#160;the&amp;#160;TabModuleSettings&amp;#160;and&amp;#160;ModuleSettings &lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_settings&amp;#160;=&amp;#160;Portals.PortalSettings.GetTabModuleSettings(&lt;/span&gt;&lt;span class="keyword"&gt;New&lt;/span&gt;&lt;span&gt;&amp;#160;Hashtable(ModuleSettings),&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;New&lt;/span&gt;&lt;span&gt;&amp;#160;Hashtable(TabModuleSettings)) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;If&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Return&lt;/span&gt;&lt;span&gt;&amp;#160;_settings &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Get&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Property&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;更多信息你可以参看dnn核心模块,比如Survey,Link等等.&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font color="#ff9900"&gt;4) CDefault( or PageBase)&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;所属命名空间:DotNetNuke.Framework&lt;/div&gt;
&lt;div&gt;PageBase是DNN核心页面基类,而CDefault是对此有所封装的类,两者何时需要主要看你的开发需要,在此我就分别举两个例子:&lt;/div&gt;
&lt;div&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;1&amp;gt;一般模块中的aspx需要继承PageBase,PageBase主要有LocalResourceFile,PortalSettings等属性,比如你模块中存在一个Print.aspx,后台代码可以如此声明:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="vb"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-vb"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;Partial&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Class&lt;/span&gt;&lt;span&gt;&amp;#160;Print &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Inherits&lt;/span&gt;&lt;span&gt;&amp;#160;PageBase &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Class&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;2&amp;gt;模块里的用户控件如果需要控制页面信息时,可以新增一个属性BasePage,代码如下:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="vb"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-vb"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;ReadOnly&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Property&lt;/span&gt;&lt;span&gt;&amp;#160;BasePage()&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;As&lt;/span&gt;&lt;span&gt;&amp;#160;DotNetNuke.Framework.CDefault &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Get&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Return&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;CType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;Me&lt;/span&gt;&lt;span&gt;.Page,&amp;#160;DotNetNuke.Framework.CDefault) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Get&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;End&lt;/span&gt;&lt;span&gt;&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Property&lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;这时你就可以在用户控件加载时动态修改页面相关属性,比如Title:&lt;/div&gt;
&lt;div&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Me.BasePage.Title = Me.BasePage.Title &amp;amp; " - " &amp;amp; m_oEntry.Title&lt;/div&gt;
&lt;div&gt;本站点博客模块就是如此动态设置页面标题的.&lt;/div&gt;
&lt;div&gt;&lt;span class="ModuleHeader" id="dnn_ctr450_dnnTITLE_lblTitle"&gt;或你可以直接如此设置:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="ModuleHeader" id="dnn_ctr450_dnnTITLE_lblTitle"&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="vb"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-vb"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;'Override&amp;#160;the&amp;#160;page&amp;#160;title &lt;/span&gt;&lt;span&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span class="keyword"&gt;Dim&lt;/span&gt;&lt;span&gt;&amp;#160;myPage&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;As&lt;/span&gt;&lt;span&gt;&amp;#160;DotNetNuke.Framework.CDefault &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;myPage&amp;#160;=&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;CType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;Me&lt;/span&gt;&lt;span&gt;.Page,&amp;#160;CDefault) &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;myPage.Title&amp;#160;=&amp;#160;Localization.GetString(&lt;/span&gt;&lt;span class="string"&gt;"ControlTitle_YourPage"&lt;/span&gt;&lt;span&gt;,&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;Me&lt;/span&gt;&lt;span&gt;.LocalResourceFile)&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;link href="/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/plugins/highlighter/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet" /&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#ff9900"&gt;&lt;strong&gt;5) Globals&lt;/strong&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;所属命名空间:DotNetNuke.Common&lt;/div&gt;
&lt;div&gt;这是DNN模块开发用得最多的一个静态类,汇聚了DNN核心最基本的静态方法,如果你有心想开发好模块,好好看看这里边的方法,你会有意想不到的收获.比如:&lt;br /&gt;
&amp;lt;1&amp;gt;ConvertDataReaderToDataTable:把DataReader转化为DataTable&lt;br /&gt;
&amp;lt;2&amp;gt;ConvertDataReaderToDataSet:把DataReader转化为DataSet&lt;br /&gt;
&amp;lt;3&amp;gt;NavigateURL:最经典的DNN导航(跳转)函数&lt;br /&gt;
&amp;lt;4&amp;gt; SendMail:DNN核心发送邮件方法&lt;br /&gt;
&amp;lt;5&amp;gt;FriendlyUrl:友好URL重写方法&lt;br /&gt;
&amp;lt;6&amp;gt;GetFileList:获取DNN站点根目录下文件列表,如果你在用UrlControl你会觉得这个方法是你所必须知道的.&lt;br /&gt;
等等.&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font color="#ff9900"&gt;6) CBO ( and Null )&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;所属命名空间:DotNetNuke.Common.Utilities&lt;/div&gt;
&lt;div&gt;这是DNN模块数据层所必备的一个工具类,对此我也曾专题般的讨论过,合理的使用CBO决定你即将开发的模块的命运,比如扩展性,兼容性,维护代价等等.&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;相关链接:&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;a target="_blank" href="http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/BlogID/1/EntryID/4/Default.aspx"&gt;解析DNN新生宠儿DAL+&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;a target="_blank" href="http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/BlogID/1/EntryID/11/Default.aspx"&gt;DNN Object Hydrator -- CBO解析&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;a target="_blank" href="http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/BlogID/1/EntryID/17/Default.aspx"&gt;王者归来—再谈CBO&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font color="#ff9900"&gt;7) DNNClientAPI&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;所属命名空间:DotNetNuke.UI.Utilities&lt;/div&gt;
&lt;div&gt;这是DNN赫赫有名的一个辅助类,为DNN模块开发客户端脚本和服务器交互起到不可或缺的作用,同时支持本地化使得脚本也真正实现了本地化.最经常使用例如我们需要在点击某一个删除按钮弹出提示信息,如今在DNN模块及其简单,就是一句代码即可:&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ClientAPI.AddButtonConfirm(cmdAddComment, LocalizationByKey("cmdDeleteCommentMessage"))&lt;br /&gt;
在此再举一个比较经典的应用范例,有时我们需要在客户获取目标控件并对此操作,可由于ASP.Net(DNN)在生成页面时已自动生成客户端代码,比如某一TextBox控件screenName最终可能会生成类似dnn_ctr431_QuickLogin_screenName,如果你在客户端脚本中直用document.getElementById('cmdHome')获取该控件的话,只会返回一个undefined或null,这时就需要我们在客户端注册一个页面ID前缀,而DNN早为我们想到了,那就是dnn.js脚本为我们提供两个方法dnn.gerVar和dnn.setVar,具体流程就是首先在页面注册页面前缀:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="c#"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;ClientAPI.RegisterClientReference(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;.Page,&amp;#160;ClientAPI.ClientNamespaceReferences.dnn); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;ClientAPI.RegisterClientVariable(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;.Page,&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"Container_ID"&lt;/span&gt;&lt;span&gt;,&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;.ClientID&amp;#160;+&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;"_"&lt;/span&gt;&lt;span&gt;,&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;);&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;然后在脚本中你可以直接得到你想要的控件对象:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div class="dp-highlighter" id="javascript"&gt;
&lt;div class="bar"&gt;&amp;#160;&lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&lt;span&gt;&amp;#160;_ModuleContainer; &amp;#160;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;(&amp;#160;&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(_ModuleContainer)&amp;#160;==&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;'undefined'&lt;/span&gt;&lt;span&gt;&amp;#160;)&amp;#160;&amp;#160;_ModuleContainer&amp;#160;=&amp;#160;dnn.getVar(&lt;/span&gt;&lt;span class="string"&gt;'Container_ID'&lt;/span&gt;&lt;span&gt;); &amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&lt;span&gt;&amp;#160;screenName&amp;#160;=&amp;#160;$get(&amp;#160;_ModuleContainer&amp;#160;+&amp;#160;&lt;/span&gt;&lt;span class="string"&gt;'screenName'&lt;/span&gt;&lt;span&gt;).value;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;link href="/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/plugins/highlighter/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet" /&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <link>http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/entryid/40/Default.aspx</link>
      <author>dnnsun@gmail.com</author>
      <comments>http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/entryid/40/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/entryid/40/Default.aspx</guid>
      <pubDate>Fri, 23 May 2008 10:23:53 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.dnnsun.com/DesktopModules/SunBlog/Trackback.aspx?id=40</trackback:ping>
    </item>
  </channel>
</rss>