二十四画生的Blog


        ——开始学习DotNetNuke(DNN)
posts - 85, comments - 1170, trackbacks - 43, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

  DNN做为一个功能强大的网站框架,它提供了提供了很多有用的类来为开发模块提供方便,以下列出几个和模块开发紧密相关的类:

PortalModuleBase
说明:模块基类。所有的模块都是通过该类继承而来。这个类定义了DNN模块所要用到的方法和属性。
命名空间:DotNetNuke.Entities.Modules
文件位置:Components\Modules\PortalModuleBase.vb
常用方法:
EditUrl:根据模块定义的ControlKey获取访问相应控件的Url。我们要调用在模块定义中定义的控件都可以通过该方法实现。
重载列表
Public Function EditUrl() As String;默认调用ControlKey=Edit的控件,不传递参数,一般用于新建。
Public Function EditUrl(ByVal ControlKey As String) As String;调用指定ControlKey的控件。
Public Function EditUrl(ByVal KeyName As String, ByVal KeyValue As String) As String;调用ControlKey=Edit的控件,可传递一个名为KeyName值为KeyValue的参数。如编辑文章时,我们就可以通过EditUrl("ArticleID",ArticleID)的方法调用编辑文章的控件
Public Function EditUrl(ByVal KeyName As String, ByVal KeyValue As String, ByVal ControlKey As String) As String;调用指定ControlKey的控件,并传递名为KeyName值为KeyValue的参数。比如:在查看文章时,我们定义一个ControlKey=Show的控件,然后通过EditUrl("ArticleID",ArticleID,"Show")的方法就可以调用文章查看控件了.
Public Function EditUrl(ByVal KeyName As String, ByVal KeyValue As String, ByVal ControlKey As String, ByVal ParamArray AdditionalParameters() As String) As String;当有多个参数需要传入控件的话,我们就需要用这个方法。比如:我们在查看控件的时候需要,在传入一个A参数,那么我们可以通过EditUrl("ArticleID",ArticleID,"Show","A=Avalue"),如果还要传递更多参数,可以通过先定义一个string数组,然后将需要传递的参数,存到这个数组中。
如:
Dim params(2) As String
params(0) = "A=Avalue"
params(1) = "B=Bvalue"
strUrl = EditUrl("ArticleID",ArticleID,"Show",params)
属性:
Actions;模块所具有的操作集合,可以通过实现IActionable接口来定义模块操作,如:添加一个“新建文章”的操作。这些操作将会显示到模块的以下位置:


IsEditable;获取当前用户是否有该模块的编辑权限
LocalResourceFile;设置或获取当前控件对应的语言资源文件
ModuleId;获取模块ID
PortalAlias;获取当前站点的别名
PortalId;获取当前站点ID
Settings;获取模块设置参数集合。我们可以通过设置模块来定义这个模块的相关参数。例如:我们将通过设置模块设置该文章模块列表文章的每页数量。
UserId;获取当前用户ID
UserInfo;获取当前用户信息

ModuleSettingsBase
说明:设置模块基类。继承与模块基类,拥有模块基类的所有属性和方法,并对其进行扩充。
命名空间:DotNetNuke.Entities.Modules
文件位置:Components\Modules\ModuleSettingsBase.vb
常用方法:
Public Overridable Sub LoadSettings();设置模块需要重写这个方法,用来实现读取模块设置。
Public Overridable Sub UpdateSettings();设置模块需要重写这个方法,用来实现添加更新模块设置。
属性:
ModuleSettings;模块参数的设置集合
TabModuleSettings;页面模块参数的设置集合
这里我们要了解DNN中的一个概念才好理解这个两个参数的区别。我们可以在页面中添加一个模块,并且可以我们还可以用添加一个已经存在模块的方法把这个模块添加到其他页面上。象这样添加的模块,在数据读取上是一致的,我们只是添加了一个新的模块显示,而不是一个新的模块。如果添加的是新模块那么ModuleId是不同的,如果添加的是一个已经存在的模块,那么ModuleId是相同的,不同的是TabModuleId。也就是说ModuleSettings,应用于同一个ModuleId的模块,TabModuleSettings,应用于每一个TabModuleId的模块,即使是同一个模块也可以在不同的地方设置不同的参数。

Globals
说明:包含一些通用的方法。
命名空间:DotNetNuke.Common
文件位置:Components\Shared\Globals.vb
常用方法:
FriendlyUrl;获取Url友好表现形式
NavigateURL;用于获取页面的Url,在DNN中每一个页面都是由一个TabID来标识的。我们可以通过TabID定位到指定页面。模块开发中最常用的是NavigateURL(),用于获取当前TabID的页面,主要用于返回操作。
SendMail;发送邮件(新版DNN中已经移动到Services.Mail.Mail类)
SendNotification;和发送邮件一样(新版DNN中已经移动到Services.Mail.Mail类)
属性:
HostPath;主机路径
HostMapPath;主机物理路径
HostSettings;主机设置集合

Null
说明:提供数据的空值形式。主要用于和数据库中空值进行转换。
命名空间:DotNetNuke.Common.Utilities
文件位置:Components\Shared\Null.vb
常用方法:
IsNull;判断是否为空值

HtmlUtils
说明:包含Html有关操作的常用方法。
命名空间:DotNetNuke.Common.Utilities
文件位置:Components\Shared\HtmlUtils.vb
常用方法:
Clean;清除Html标签,RemovePunctuation参数表示是否同时清除标点符号
FormatEmail;将email地址转化为<a href="mailto:Email">Email</a>,并对其编码,以防止被网页爬虫类式的软件获取,以保护隐私信息。
FormatText;将Html中的<br/>标签转化为换行符。RetainSpace参数表示是否将被替换掉的地方保留空格。
FormatWebsite;将网站地址转换为<a href="Website">Website</a>形式。
Shorten;输出指定长度的文本。suffix表示被截断部分的后缀形式,例如:“...”
StripEntities;还没搞懂,希望有知道回复以下:)
StripTags;清除Html标签,RetainSpace参数表示是否将被替换掉的地方保留空格。
StripPunctuation;清除标点,RetainSpace参数表示是否将被替换掉的地方保留空格。
StripWhiteSpace;清除空格字符,RetainSpace参数表示是否将被替换掉的地方保留空格。
StripNonWord;清除非字符,RetainSpace参数表示是否将被替换掉的地方保留空格。

PortalSecurity
说明:安全和身份验证相关的类。
命名空间:DotNetNuke.Security
文件位置:Components\Security\PortalSecurity.vb
常用方法:
IsInRole;判断当前用户是否具备某一角色,如:PortalSecurity.IsInRole("Role1")
IsInRoles;判断当前用户是否在某一组角色中,如:PortalSecurity.IsInRoles("Role1;Role2")

Localization
说明:提供多语言支持
命名空间:DotNetNuke.Security
文件位置:Components\Localization\Localization.vb
常用方法:GetString;获取指定参数的本地语言字符串,如:Localization.GetString("My.Text", Me.LocalResourceFile)
有关更多本地化的信息请看这篇文章:《DNN中的本地化——打造全球通用的程序

Exceptions
说明:记录处理异常。
命名空间:DotNetNuke.Services.Exceptions
文件位置:Components\Exceptions\Exceptions.vb
常用方法:ProcessModuleLoadException;处理模块加载时的异常。这个方法可以根据用户身份决定是否显示详细的异常信息,并可以根据网站设置决定是否记录异常。

Skin
说明:皮肤相关的类
命名空间:DotNetNuke.UI.Skins
文件位置:admin\Skins\Skin.vb
常用方法:AddModuleMessage;添加一个消息到模块上,如:在查看文章时没有该文章是我们可以给出提示。


  在DNN的模块开发过程中基本上就是通过这几个类提供的方法来实现了。这几个类封装了DNN中的大多数功能,为我们提供了简单的访问接口,使我们开发DNN模块基本上不用去了解DNN的内部实现。但为了更好的理解和使用DNN,我们还是需要更深入的透过这些类去了解DNN中更核心更基本的东西。从DNN的核心类设计上去了解DNN开发者的架构艺术,去学习和掌握面向对象的程序设计和多种设计模式的灵活运用。在下一篇《DNN模块开发系列文章(5)——DNN中的通用控件》中我将介绍一些DNN中定义的一些通用控件,为我们开发真正具有DNN风格的模块进一步打好基础。

 


系列文章导航:
DNN模块开发系列文章(1)——分析设计
DNN模块开发系列文章(2)——建立模块开发项目
DNN模块开发系列文章(3)——在DNN中添加模块定义
DNN模块开发系列文章(4)——与模块开发相关的类

Feedback

#1楼    回复  引用  查看    

2006-08-11 15:16 by aspnetx      
感觉自己对DNN的架构还不是很理解

#2楼    回复  引用    

2006-08-11 18:05 by mill [未注册用户]
使用DNN Project Templates 时有许多ERRORS,未能建立模块.

继续支持您的DNN模块开发系列文章!!!

#3楼 [楼主]   回复  引用  查看    

2006-08-11 20:24 by 二十四画生      
@aspnetx
DNN架构要花时间去读代码分析代码,开始会觉得茫然理不清头绪,只要坚持下去,总有顿悟的一天。

@mill
什么样的错误?

#4楼    回复  引用    

2006-08-12 10:02 by mill [未注册用户]
@二十四画生

偶要重试一下,有问题再贴出来

#5楼    回复  引用    

2006-08-12 21:54 by yxzyxz [未注册用户]
支持,请继续发表大作.

#6楼    回复  引用    

2006-08-13 17:06 by mill [未注册用户]
@二十四画生

使用DNN Project Templates 创建DNN模块表示层项目时,有许多ERRORS,未能建立模块.
后来将自动生成的继承PortalModuleControl改为PortalModuleBase后,消除了绝大多数的ERRORS,但仍然下面的错误。
同时,自动生成的ArticleBLL.vb在删除后,会出现更多的错误。
感觉用DNN Project Templates 也很麻烦的。

ArticleBLL.vb(65): “CBO”不是“DotNetNuke”的成员。
ArticleBLL.vb(73): “CBO”不是“DotNetNuke”的成员。
ArticleBLL.vb(69): “CBO”不是“DotNetNuke”的成员。
ArticleEdit.ascx.vb(54): 类型“Integer”的值无法转换为“System.Reflection.PropertyInfo”。
Article.ascx.vb(34): 名称“SecurityAccessLevel”未声明。
Article.ascx.vb(35): 名称“SecurityAccessLevel”未声明。
Components\DataProvider.vb(22): 未定义类型“DotNetNuke.ProviderConfiguration”。
无法找到项目级 Imports“DotNetNuke.Date”中的命名空间或类型“Date”。
Article.ascx.vb(35): 重载决策失败,原因是没有可访问的“EditUrl”可以用这些参数调用:
'Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String, ParamArray AdditionalParameters() As String) As String': 没有为“Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String, ParamArray AdditionalParameters() As String) As String”的参数“KeyName”指定参数。
'Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String, ParamArray AdditionalParameters() As String) As String': 没有为“Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String, ParamArray AdditionalParameters() As String) As String”的参数“KeyValue”指定参数。
'Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String) As String': 没有为“Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String) As String”的参数“KeyName”指定参数。
'Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String) As String': 没有为“Public Function EditUrl(KeyName As String, KeyValue As String, ControlKey As String) As String”的参数“KeyValue”指定参数。

没有试过 CodeSmith Templates。

#7楼 [楼主]   回复  引用  查看    

2006-08-13 17:52 by 二十四画生      
@mill
你用的是那个版本的DNN Project Templates 呀?
怎么和我生成的代码不一样。DNN 2.x才是Inherits DotNetNuke.PortalModuleControl

我想你一定是下载错了,要下载DNNProjectTemplates v3.0.1。

#8楼    回复  引用    

2006-08-14 16:04 by mill [未注册用户]
@二十四画生

偶疏豁了,偶用的是V3.0的,这两个版本差别很大的.谢谢您的及时纠正^_^

编译是通过了,模块安装后,显示有点问题,再查...

继续支持您的DNN模块开发系列文章!!!




#9楼    回复  引用    

2006-08-15 12:29 by antoknet [未注册用户]
谢谢!!二十四画生给我写这么好的文章!
我已经把你的文章放到WWW.dnnfamily.com上了!

欢迎访问DNN资料大全网站www.DNNfamily.com网站包含了全部的DNN文档、开发技巧、模块、皮肤供大家学习。
www.DNNfamily.com

#10楼    回复  引用    

2006-08-31 15:24 by lxy [未注册用户]
继续支持!

#11楼    回复  引用    

2006-09-08 10:39 by 基督山伯爵 [未注册用户]
Public Overridable Sub UpdateSettings();
Public Overridable Sub LoadSettings();
c#怎么实现这样啊!!!


请教!!这个不会写!!!如何将自己写的load到里面!
如何更新!

#12楼 [楼主]   回复  引用  查看    

2006-09-08 10:45 by 二十四画生      
@基督山伯爵
public override void UpdateSettings();
public override void LoadSettings();

#13楼    回复  引用    

2006-10-11 16:40 by programmer[匿名] [未注册用户]
study...

#14楼    回复  引用    

2007-08-17 16:09 by 小兔子 [未注册用户]
二十四画生,你好,我刚刚学习dnn,你说在向页面添加模块时,如果添加同一个模块添加到不同页面,他的TabModuleID不同,而ModuleID相同,但是你可以看看TabModules这个表,他的TabModuleID不同,ModuleID也不同,只是同一页面的TabID是相同的,在Modules表中,当向页面添加一个模块时,该表会增加一个记录,这个表中,同一个模块的ModuleID是不同的,相同的是ModuleDefID,请问这是怎么回事?

#15楼 [楼主]   回复  引用  查看    

2007-08-17 19:18 by 二十四画生      
@小兔子
ModuleDef理解为模块定义,定义实现不同功能的模块,比如:Links,Text/Html
Module是模块定义的实例,一个模块定义,当然可以被重复使用,只是他们的内容不同而已
TabModule其实是表明模块显示的位置,同样功能,同样内容的模块,再不同页面显示而已。

#16楼    回复  引用  查看    

2008-06-16 21:54 by dnnme      
非常感谢楼主的贡献.


----------------------------------------------
DNN专业论坛:http://www.dnnme.cn

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-08-11 20:26 编辑过


相关链接: