分享

Module_模块开发系列文章7篇

 kommy 2007-09-13
 



  DNN做为一个优秀的门户网站框架,可以通过安装各种功能模块的方式扩充应用。正是通过这一优秀的功能,DNN框架可以实现:文章管理,图片管理,文档管理,论坛,博客,商店,调查,FAQ等等各种各样满足实际需求的模块。通过这个强大的框架支持,我们可以很容易的实现这些模块。比如:权限控制,多语言支持,多数据库支持,搜索,聚合,皮肤等功能,我都可以很容易的通过框架实现。如果是在平时,光是实现这些基础功能我们就需要花去大量的时间。现在有了DNN框架的支持,我们就可以集中精力投入到模块的业务逻辑和流程上,从而大幅度提高开发效率和质量。
  《DNN模块开发系列文章》将通过开发一个简单的文章模块(Article)为例,讲解整个模块的开发流程,和模块相关的一些DNN命名空间功能,如何实现模块搜索、聚合、导入导出等扩展功能,以及后期如何维护和升级DNN模块。

  一般来说DNN模块开发有以下6个步骤,我也将安照每个开发环节,讲讲我在DNN模块开发中的心得:
1、分析设计(确定模块功能,确定数据字段表结构,确定数据表名称,确定解决方案名称等几个工作)
2、建立开发环境(确定整个模块的文件结构,讲解DNN模块需要用到的dll和命名空间,以及这些命名空间的功能)
3、程序设计(设计需要几个控件来实现,每个控件的作用名称)
4、程序编码(介绍使用CodeSmith,进行数据访问层、业务逻辑层和存储过程的编码)
5、实现模块的扩展功能(如:搜索,聚合,导入导出)
6、生成安装脚本,打包程序。(讲解如何高效正确的编写安装脚本和生成安装包)


分析设计

  首先讲讲这个文章模块将要实现的功能:一个简单的文章模块,提供发布文章(包括作者,标题,内容,发布时间),列表显示(数字分页,需要设置分页大小),需要提供导入导出聚合和DNN中检索功能。
根据上述需求描述,我确立了以下表结构
文章信息表:MyCompany_Article
ArticleID               文章ID      int                       主键
ModuleID             模块ID      int                       关联模块信息表(Modules)
Title                      标题          nvarchar(225)
Content                 内容          ntext
CreatedByUser     作者          int                       此处存用户ID
CreatedDate         创建时间  datetime
注:因为DNN可以安装多个功能模块,为了不和其他模块发生冲突,最好以公司名+模块功能描述的方式来命名。如果你的文章信息表其名为Article就很容易和其他文章冲突。

  解决方案名称也遵循公司名+模块功能描述的方式来命名,所以我确定模块解决方案名称为MyCompany.Article。

  通过上述分析,我们基本清楚了这个模块要实现的功能,下面就可以实际动手开发了。下一篇文章是《DNN模块开发系列文章(2)——建立模块开发项目》,将讲述如何建立一个简单高效的模块开发项目和组织一个清晰的文件结构。


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

        开发DNN模块可以通过两种开发环境来进行:
一、在整个DNN解决方案下建立模块开发项目。
        优点:可以方便的引用DNN组件,参考其他模块的实现方式,可以随时通过“转到定义”的操作查看DNN中该方法的定义,调试起来也比较容易。
        缺点:速度慢。打开项目和编译项目都要费大量时间。
二、用单独的方式建立模块解决方案。
        优缺点正好和第一种相对,不过在实际开发中速度是关键,下面我就单独讲讲我在以单独方式建立模块开发解决方案中的一些心得。

      建立单独的解决方案进行模块开发需要解决三个问题:
1、在什么地方建立解决方案有助于边开发边测试?
2、如何对原有dll进行引用,生成的dll又到那个目录中?
3、怎样进行调试?

       欲善其事,必先利其器。首先,我们应该为开发DNN模块准备以下工具:
DNN Project Templates :一个由dnnjungle提供的VS.NET 2003下的功能插件。安装后,可以直接通过它在VS环境来创建DNN项目和一些DNN中所用的项。
CodeSmith Templates:一组生成DNN模块业务逻辑层代码和数据访问层代码所用到的,CodeSmith代码生成模板。
CodeSmith:代码生成工具,结合上述模块,可以大大加快代码编写工作。(http://www./
相关网址:http://dnnjungle./Development/Templates/tabid/28/Default.aspx

      当上面的工具都安装好后就可以开始我们的模块开发工作了。该模块用VS.NET 2003开发环境,以DNN3.3.3做为平台,数据库使用SQL Server数据库。

1、创建DNN模块表示层项目。运行VS,创建DNN模块开发项目。如果,你安装好DNN Project Templates后,在创建新项目时,在项目类型处将会出现“Visual Basic Project for DotNetNuke 3”和“Visual C# Project for DotNetNuke 3”这两个新项目。在这里我选择VB.NET作为开发语言,其实用C#是一样可以开发DNN模块的。选择“DNN Module”模板,项目名称设置为:Article,项目位置选择DNN程序所在文件夹的DesktopModules目录,这样有利于边开发边测试。如下图:

2、创建DNN模块数据访问层项目。点击添加“新项目”,选择“DNN SqlDataProvider DAL”,项目名称为:Article。项目位置:DesktopModules\Article\Providers\DataProviders。如下图:

3、设置DNN模块表示层项目属性添加引用。首先,该项目需要添加DNN程序Bin目录下的DotNetNuke.dll组件的引用。项目属性到不用修改,默认设置即可。启用该项目,默认导入了一些DNN的命名空间,这样你就不必再每个文件中引用这些命名空间了。但是在以后文章中我还是会介绍到这些命名空间的作用,即常用功能。

4、设置DNN模块数据访问层项目属性添加引用。首先,该项目需要添加DNN程序Bin目录下的DotNetNuke.dll和Microsoft.ApplicationBlocks.Data.dll组件的引用,并且还要添加表示层的项目的引用。其次,将该设置为启动项目。设置项目生成路径为DNN程序的bin目录。这样每次编译后都可以及时调试。



5、编译程序,目前这个地方改的可以编译通过就可以了,以后我们还要重新对它进行编写。

注:DNN3.3.X下开发的模块,可以在DNN4.3.X上使用。

来看看,我们建立的开发项目吧,如下图:

MyCompany.Article项目
App_LocalResources :语言包文件夹,存放与用户控件同名的资源文件
Components :业务逻辑代码文件夹
ArticleController.vb:业务逻辑对像,实现对像/关系映射,也就是实现业务实体对像到数据库的转换
ArticleInfo.vb:业务实体对像
DataProvider.vb: 支持多数据库访问Provider,相当于一个到多种数据库访问接口
Documentation : 可以放一些开发文档和用户说明书(如果制做安装包不需要时,请把它从项目中排除) 
Installation :  可以放一些生成好的安装包做为备份使用,制做安装包前,需要把它从项目中排除
Providers :  放置一些模块相关的Provider,目前只有DataProviders,如果你还有其他需要兼容括充的业务,你也可以编写其他的Provider。例如:文章模块将来需要用到图表显示文章查看情况。网上可以使用的图表组件很多,你就可以编写一个ChartProvider,提供访问的统一接口。然后编写相应图表组件的Provider实现,如:ZedGraphProvider,WebChartProvider等。这样就可以通过在web.config中进行设置,灵活的兼容多种图表组件。Provider模式是DNN中一个应用非常广范设计思想,可以说是DNN的一个亮点。
Article.ascx :做为文章列表显示控件
ArticleEdit.ascx :做为文章新建/编辑控件
ArticleShow.ascx:目前还没有,再以后新建做为文章显示控件
icon_Article_32px.gif :模块图标
module.css :模块所用到的样式
Settings.ascx :做为设置文章列表分页大小控件

MyCompany.Article.SqlDataProvider 项目
01.00.00.SqlDataProvider 模块数据库对像创建脚本
SqlDataProvider.vb    SQL Server数据库访问具体实现类
Uninstall.SqlDataProvider 模块数据库对像删除脚本

调试程序

        有一篇文章有详细介绍:http://www.cnblogs.com/leeichang/archive/2004/11/16/64418.html
大致就是,通过附加进程,来调试程序,方便快速,十分好用。那篇文章已经介绍的非常好了,我就不多讲,只是大家要注意:默认情况下,ASP.NET 进程(对于 Windows 2000 和 Windows XP 上的 IIS 5.0 和 IIS 5.1 为 aspnet_wp.exe,对于 Windows Server 2003 上的 IIS 6 为 w3wp.exe)作为 ASPNET 进程运行。因此,要调试它,您必须具有运行 ASP.NET 的计算机的管理员特权。

        DNN模块项目初步建立完成了,我们就需要在DNN中添加该模块,看看该模块是否能正常添加运行,为下一步开发打好基础。在《DNN模块开发系列文章(3)——在DNN中添加模块定义》一文中我将详细介绍,如何在DNN添加一个模块。


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

添加模块定义

  完成了以上几篇文章介绍的工作后,我们就可以把模块添加到DNN中了。虽然现在这个模块还不能运行,但是先添加进去就可以一边开发一边看到它的效果了。

一、用host(主机管理员)的身份登陆,进入“Host --> Module Definitions”,点击“Add New Module Definition”添加新的模块定义。

二、输入以下模块信息后点击“Update”保存新模块。
Module Name(模块名称):MyCompany.Article
Folder Name(模块所在文件夹):Article 注:这个要如实填写写。
Friendly Name(友好名称):MyArticle 这个可以随便填写,在可添加模块列表中的显示值。
Description(描述信息):MyCompany Article
Version(版本信息):01.00.00
Controller Class(控制类):这个主要用于告诉DNN实现ISearchable(查询聚合接口)和IPortable(导入导出接口)的类,这里我们输入:DotNetNuke.Modules.Media.MediaController, DotNetNuke.Modules.Media。在以后我们将实现这些类。
Supported Features(支持属性):保存后DNN会根据你实现的接口自动获得。Upgradeable 是个新特性我还没有仔细研究,以后看过后在和大家说说。其他两个就是查询聚合,导入导出了。
Premium(是否收费):可以指定该模块在那些网站可以使用。


三、添加模块定义。一个模块可以包括多个模块定义,让他们配合工作。
Definitions:已有的模块定义。
New Definition:添加新的模块定义。这里我们输入:MyCompany.Article


四、添加控件。每一个模块定义又可以包含多个控件,来完成如:列表,添加/编辑,查看,设置等操作。点击“Add Control”(添加控件)进行如下设置:
1、添加列表显示模块:
Key:为空。为空的控件将默认首先显示在页面上。
Title:控件标题。输入:Article
Source:控件原文件。选择:DesktopModules/Article/Article.ascx
Type:控件类型。其实可以理解为访问该控件的权限设置。Skin Object:皮肤控件,Anonymous:可匿名访问,View:需要查看权限,Edit:需要编辑权限,Admin:需要主机管理员权限,Host:主机管理权限。这里我们选择:View。因为文章列表只要查看权限就可以了。
View Order:排序号。
Icon:控件图标。
Help Url:该控件对应的帮助地址。


2、添加文章添加编辑控件,输入以下属性:
Key:为Edit。Key用来标识一个控件的作用。在代码中我们可以通过EditUrl方法来定位到我们需要的控件。这个我将在下一篇文章中详细介绍。
Title:Edit Article
Source:DesktopModules/Article/ArticleEdit.ascx
Type:Edit
其余为空
3、添加文章设置控件,输入以下属性:
Key:为Settings。只有为Settings的控件在点击DNN设置时才会默认被调用。
Title:Setting Article
Source:DesktopModules/Article/ArticleSettings.ascx
Type:Admin
其余为空

  以后我们添加了文章查看控件后,将在这里继续设置。现在就这些操作就基本完成了整个模块的定义。不过现在添加模块还是会出错的,毕竟我们一行代码也没有写。在开始对模块进行编码是我们还需要先了解一下与模块相关的一些命名空间,控件和一些常用的类。在《DNN模块开发系列文章(4)——与模块开发相关的类》中我将介绍这些类和控件的做用及用法。
 


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

  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)——与模块开发相关的类
 
 
 
 
 

  DNN中的通用控件主要在DotNetNuke.UI命名空间下,而与模块开发紧密相关的都在DotNetNuke.UI.UserControls中,它们是开发具有DNN风格模块不可缺少的元素。

LabelControl



简介:
标签控件。这个应该是用的最多的一个控件了。主要起到在输入框前起提示作用,如果点击问号图标开可以给出详细的说明。
位置:
controls\LabelControl.ascx
属性:
ControlName:对应控件。指明该标签对应用那一个控件。如果点击标签就可以使对应的获得焦点。
Text:标签显示文本。
HelpKey:标签帮助对应的ResourceKey(在语言资源文件中获取对应值得关键字)
HelpText:标签帮助文本。在使用时如果显示指明HelpText=""将不显示标签前的问号图标。
ResourceKey:在语言资源文件中获取对应值得关键字。其实我们只要设置一个ResourceKey,在资源文件中分别用ResourceKey.Text和ResourceKey.Help就可以分别表示标签文本和帮助文本了。在其他ASP.NET控件中也可以用这个属性,DNN会自动分析这个属性,把它作为Text值。如:Lable,Button,HyperLink,ListItem(在RadioButtonList,DropDownList中可以通过指定其ListItem中ResourceKey属性实现多语言功能),具体用法可以在DNN的自带模块中找到大量例子。
Suffix:后缀,显示在标签后面的文本。如:?或:
使用方法:
1、首先在需要应用的页面中注册这个控件,如:
<%@ Register TagPrefix="dnn" TagName="Label" Src="~/controls/LabelControl.ascx" %>

2、在需要用到位置写下如下的代码,如:

<dnn:label id="plTitle" runat="server" controlname="txtTitle" suffix=":" />


DualListControl

简介:
它是个双列表框选择控件。它适用于在一个指定的范围内选择一部所需要的内容。在DotNetNuke程序中他可以通用,而且使用简单,只用设置好相应的属性即可。例如:要做一个授权的功能的时候,就可以在Available列表中读取系统所有的角色,将需要被授权的角色移动到Assigned列表中。

位置:
controls\DualListControl.ascx

属性:
ListBoxWidth:类型String,列表框宽度
ListBoxHeight:类型String,列表框宽度
Available:类型ArrayList,可供选择的内容
Assigned:类型ArrayList,选定的内容
DataTextField:类型String,列表框文本字段
DataValueField:类型String,列表框值字段
Enabled:类型Boolean,是否有效

使用方法:
1、首先在需要应用的页面中注册这个控件,如:
<%@ Register TagPrefix="Portal" TagName="DualList" Src="~/controls/DualListControl.ascx" %>

2、在需要用到位置写下如下的代码,如:

<portal:duallist id="ctlAdminRoles" runat="server" ListBoxWidth="130" ListBoxHeight="130" DataValueField="RoleName" DataTextField="RoleName"></portal:duallist>

3、在后台代码中声明该控件

Protected WithEvents ctlAdminRoles As DotNetNuke.UI.UserControls.DualListControl

4、在后台代码中分别绑定Available和Assigned的ArrayList,如:

Dim objRoles As New RoleController
Dim arrSysRoles As New ArrayList
获取当前站点所有的角色
arrSysRoles = objRoles.GetPortalRoles(PortalId)

Dim arrAvailableAdminRoles As New ArrayList
Dim arrAssignedAdminRoles As New ArrayList

arrAvailableAdminRoles 
= arrSysRoles
当不是新建时,初始化已选定角色ArrayList,在可选择角色ArrayList中派出已选择部分
objInfo.AdminRoles是以分号分隔的角色名
ctlAdminRoles:DualListControl
If Not objInfo Is Nothing Then
    
获取已经选定的角色
    Dim arrAdminRoles As String() = objInfo.AdminRoles.Split(";")
    
Dim RoleName As String
    
For Each RoleName In arrAdminRoles
        
Dim objRole As New RoleInfo
        objRole.RoleName 
= RoleName
        arrAssignedAdminRoles.Add(objRole)
    
Next
    
For Each objAvailableRole As RoleInfo In arrAvailableAdminRoles
        
For Each objAssignedRole As RoleInfo In arrAssignedAdminRoles
            
If objAvailableRole.RoleName = objAssignedRole.RoleName Then
                arrAvailableAdminRoles.Remove(objAvailableRole)
            
End If
        
Next
    
Next
End If

ctlAdminRoles.Available 
= arrAvailableAdminRoles
ctlAdminRoles.Assigned 
= arrAssignedAdminRoles
ctlAdminRoles.DataBind()

5、从控件中获取选定项

strAdminRoles:以分号分隔的角色名
ctlAdminRoles:DualListControl
Dim strAdminRoles As String = String.Empty
For Each objItem As ListItem In ctlAdminRoles.Assigned
    strAdminRoles 
= strAdminRoles + ";" + objItem.Text
Next
strAdminRoles 
= strAdminRoles.Substring(1)


ModuleAuditControl



简介:显示创建人和创建时间的控件。
位置:controls\ModuleAuditControl.ascx
属性:
CreatedByUser:创建人。在DNN3.3.x版可以直接输入用户ID就可以显示用户名了。
CreatedDate:创建时间。
使用方法:
1、首先在需要应用的页面中注册这个控件,如:
<%@ Register TagPrefix="Portal" TagName="Audit" Src="~/controls/ModuleAuditControl.ascx" %>

2、在需要用到位置写下如下的代码,如:

<portal:Audit id="ctlAudit" runat="server" />


3、在后台代码中声明该控件和使用这个控件

Protected WithEvents ctlAudit As ModuleAuditControl

ctlAudit.CreatedDate 
= objArticle.CreatedDate.ToString
ctlAudit.CreatedByUser 
= objArticle.CreatedByUser.ToString


SectionHeadControl



简介:
可以选择将一部分功能显示的控件,分组到一个table中。并用这个控件实现折叠和展开这组控件。DNN在页面设置、主机设置用的很多。如果你开发的模块有许多要输入的字段,不妨也用用这个控件,把要输入的信息分组,把一些较少用到字段折叠,起到简化界面的作用。
位置:
controls\SectionHeadControl.ascx
属性:
CssClass:样式
IncludeRule:是否在这个选择标签下显示一个水平线<hr>。
IsExpanded:指示初始是否展开控件。
JavaScript:指定展开折叠功能所用到JavaScript函数,这先不用设置默认就好了。
MaxImageUrl:展开时显示图标地址。默认即可。
MinImageUrl:折叠时显示图标地址。默认即可。
ResourceKey:在语言资源文件中获取对应值得关键字。
Text:选择标签文字。这些不需要写,指定ResourceKey,并在资源文件中给出相应的值就可以了。
Section:需要展开和折叠的控件ID,一般是table或div。如果要要使用这个功能,这些table和div必须runat="server"。
使用方法:
1、首先在需要应用的页面中注册这个控件,如:
<%@ Register TagPrefix="dnn" TagName="SectionHead" Src="~/controls/SectionHeadControl.ascx" %>

2、在需要用到位置写下如下的代码,如:

<dnn:sectionhead id="dshAuthorize" cssclass="Head" runat="server" isexpanded="False" text="Authorize Settings"
  section
="tblAuthorize" resourcekey="dshAuthorize" />
<table id="tblAuthorize" runat="server"><tr><td>要折叠或展开的内容</td></tr></table>


  由于这篇文章的篇幅已经比较长了,还有TextEditor、UrlControl和URLTrackingControl这三个控件,内容也比较多就分到《DNN模块开发系列文章(6)——DNN中的通用控件(下)》中给大家介绍吧。
 


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

TextEditor:



简介:
富文本编辑器控件。功能就不用多说了吧,大家都经常用到的。DNN利用Providers模式可以很方便的集成多种富文本编辑器。据我所知就有:FreeTextBox,FCKEditor,WebHtmlEditor,CuteEditor。大家可以通过配置web.config就可以很容易的选择使用一种了,具体的配置方法在每一个富文本编辑器Providers中应该都有详细的说明。
位置:controls\TextEditor.ascx
属性:
ChooseMode:启用/禁用用户在一般文本编辑器和富文本编辑器之间切换,默认为启用
ChooseRender:是否启用在一般文本编辑器模式下决定文本内容呈现方式,默认为启用
DefaultMode:默认的编辑器模式,默认为富文本方式("RICH" or "BASIC")
HtmlEncode:是否将内容进行HTML编码(就是转义一些字符,如:"<"、">"等等)
Mode:当前编辑器的模式,是富文本方式还是一般模式("RICH" or "BASIC")
Text:控件的文本内容
Height:控件高度
Width:控件宽度
TextRenderMode:设置一般文本编辑器模式下文本呈现方式{Raw | HTML | Text}
Raw:自然方式,原来文本时什么样就是什么样显示。
HTML :将文本格式转化为HTML格式(就是:将所有回车符替换为"",将换行符替换为"<br />)
Text:将HTML格式转化为文本格式(首先替换掉全部的空白字符如制表符,再将全部的<br>标签替换为换行符)
RichText:富文本编辑器Provider

使用方法:
1、首先在需要应用的页面中注册这个控件,如:
<%@ Register TagPrefix="dnn" TagName="TextEditor" Src="~/controls/TextEditor.ascx"%>

2、在需要用到位置写下如下的代码,如:

<dnn:texteditor id="teContent" runat="server" height="400" width="500"></dnn:texteditor>

3、在后台代码中声明该控件和使用这个控件

Protected WithEvents teContent As TextEditor

teContent.Text 
= objArticle.Content
objArticle.Content 
= teContent.Text

注:如果要显示富文本的内容需要用Server.HtmlDecode()进行解码。

相关可用的富文本编辑器:
让DNN也用CuteEditor
DNN中又一个好用的富文本编辑器(FCKEditor)
LionHtmlEditorProvider(v1.0.3)

UrlControl



简介:
Url选择控件。可以选择一个网站内部的网页(Tab),可以选择一个网站内部文件或者输入一个外部网站的Url。在选择文件方式中,这个控件还有上传文件的功能(需要在文件管理系统中为用户设置权限)。而且这个控件还具有设置是否记录链接点击情况的功能,可以和URLTrackingControl(链接点击情况显示控件)配合使用。
位置:controls\UrlControl.ascx
属性:
FileFilter:文件类型。可以选择和上传得类型,如:jpg,gif,txt
LocalResourceFile:该控件对应的语言资源文件。这个不用设置,默认就可以了。
Log:获取和设置该链接是否记录点击日志。及记录详细的访问人访问时间等。
ModuleID:设置链接属于的模块。这个不需要专门的设置。这个控件会默认获取当前所在模块的ID。
NewWindow:获取和设置该链接是否通过新窗口打开。
Required:获取和设置该链接是否必须填写。默认:True
ShowDatabase:是否显示保存在数据库中的文件。默认:True
ShowFiles:是否显示添加文件选择。默认:True
ShowLog:是否显示记录日志选择。默认:True
ShowNewWindow:是否显示新窗口打开链接选择。默认:False
ShowNone:是否显示无。默认:False。
ShowSecure:是否显示保存在文件系统中的文件。默认:True
ShowTabs:是否显示网站内部页面选择。默认:True
ShowTrack:是否显示设置记录链接点击次数选择。默认:True
ShowUpLoad:是否显示文件上传。默认:True
ShowUrls:是否显示 默认:True
ShowUsers:是否显示添加一个查看用户信息的链接。默认:False
Track:获取和设置是否记录链接的点击次数。
Url:获取和设置链接值
UrlType:获取和设置当前链接类型。N:无;U:外部链接;T:内部链接;F:文件链接;M:用户信息链接
Width:控件宽度。

使用方法:
1、首先在需要应用的页面中注册这个控件,如:
<%@ Register TagPrefix="Portal" TagName="URL" Src="~/controls/URLControl.ascx" %>

2、在需要用到位置写下如下的代码,如:

<portal:url id="ctlURL" runat="server" width="250" shownewwindow="True" showusers="True" />

3、在后台代码中声明该控件和使用这个控件

声明链接控件
Protected WithEvents ctlURL As UI.UserControls.UrlControl

设置获取链接
ctlURL.Url = objLink.Url
objLink.Url 
= ctlURL.Url

记录链接的跟踪设置(只有写了一下语句链接跟踪才会起效)
DNN中用UrlTracking表来记录链接设置,UrlController是框架提供的类
Dim objUrls As New UrlController
objUrls.UpdateUrl(PortalId, ctlURL.Url, ctlURL.UrlType, ctlURL.Log, ctlURL.Track, ModuleId, ctlURL.NewWindow)

4、如果要使用链接的跟踪设置,在显示链接是还需做一些处理,具体可参见Links模块的做法。

URLTrackingControl



简介:
链接点击情况跟踪显示控件。可以显示链接的点击次数,点击时间、用户等明细。
位置:controls\URLTrackingControl.ascx
属性:
FormattedURL:设置已经格式化的链接。一般不设置,系统会自动格式化被跟踪的链接。
LocalResourceFile:该控件对应的语言资源文件。这个不用设置,默认就可以了。
ModuleID:设置需要显示那个模块的链接跟踪情况
TrackingURL:获取跟踪链接访问链接。只有通过这种方式访问才能起到跟踪效果。
URL:被跟踪的链接。

使用方法:
1、首先在需要应用的页面中注册这个控件,如:
<%@ Register TagPrefix="Portal" TagName="Tracking" Src="~/controls/URLTrackingControl.ascx" %>

2、在需要用到位置写下如下的代码,如:

<portal:tracking id="ctlTracking" runat="server" />

3、在后台代码中声明该控件和使用这个控件

Protected WithEvents ctlTracking As UI.UserControls.URLTrackingControl

ctlTracking.URL 
= objLink.Url   被跟踪的链接
ctlTracking.ModuleID = ModuleId   所用于的模块

  终于介绍完模块开发前的准备工作了,下一篇就开始介绍模块开发过程中的一些相关的知识和开发技巧。在《DNN模块开发系列文章(7)——用CodeSmith Templates进行编码》一文中让大家都体验一下开发DNN模块就一个字,快!


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

  在利用CodeSmith Templates进行代码编写之前,我们应该先完成数据表的设计。因为CodeSmith Templates是根据数据表的字段来生成相应代码的。

  首先根据《DNN模块开发系列文章(1)——分析设计》中对MyCompany_Article文章信息表的定义在SQL Server数据库中进行设计。记住要设计好主外键,特别是与Modules表的关联。

  其次,我们还可以将程序所用到存储过程先编写好。在编写存储过程时,我们可以利用CodeSmith Templates中StoredProcedures.cst模版进行编写存储过程。不过它编写好的代码好像和我通常用的命名规则不一样,所以我利用它生成的部分代码,如变量定义部分。这个文章模块的功能比较简单,就是添加、编辑、删除、查看文章,并能列举出这个模块的全部文章。所以我们可以利用5个对应的存储过程来完成,它们是:
MyCompany_Article_Add     添加
MyCompany_Article_Update    编辑
MyCompany_Article_Delete    删除
MyCompany_Article_Get     获取一篇文章
MyCompany_Article_GetByModules   获取该模块的全部文章

  大家可以试着先编写这些存储过程,在这个系列完成后我会给出全部代码。在编写时要注意所有的数据库对象前都需要加上“dbo.”,在存储过程和表的命名上,我们也应该遵循“公司名_模块名_功能名称”的原则,遵循良好的命名规则不但代码看起来可读性更高,而且在后期我们只制作数据库安装脚本时可以方便的利用查找替换的办法快速生成数据库安装脚本。

  利用CodeSmith Templates进行编程,我们当然要利用到CodeSmith这个代码生成利器。你可以在这里 http://www./ 获得它。使用CodeSmith Templates的过程和简单,首先我双击需要用到的模版。通常,我先从Info类入手,双击Vb BLL Info Class.cst模版。首先我们需要选中MultiSourceTable,挑选我们所建立的文章信息表MyCompany_Article,如下图:
1、点击MultiSourceTable属性弹出Table Picker选择窗口,选择表所在的数据库,选择表。如果没有数据库,可以点击添加。

2、添加数据库连接

3、输入ObjectQualifer(任意输,好像没用),点击Generate生成代码

4、将这段代码复制到ArticleInfo.vb文件中

  利用Vb DataProvider.cst生成DataProvider.vb文件代码。在生成时我们设置IncludeList为false,不生成获取全部文章列表的方法。将生成好的代码复制到DataProvider.vb中的相应位置,替换代码中“MyCompany_”前缀。
我们再分别利用Vb BLL Controller Class.cst和Vb SqlDataProvider.cst生成ArticleController.vb和SqlDataProvider.vb中代码,方法和前一种相同。在生成SqlDataProvider代码时,我们还需要修改一下对应的存储过程名称,因为我们命名规则和他的不一样。

  现在我们已经完成了大部分逻辑层和数据访问层代码,剩下就只有表示层的代码了。我们分别修改Article.ascx、ArticleEdit.ascx和Settings.ascx这三个控件,添加一些asp.net控件进去完成设计要求的功能。现在就和开发其它asp.net程序一样了,没有什么其它技巧和难点。只是在编写时注意参考一下DNN其它模块的代码,看看他们都是怎样的结构,DNN Project Templates也为我们添加了不少代码,我们填充完剩下的部分整个模块就算是完成了。

  程序的基本功能完成后,在下一篇文章《DNN模块开发系列文章(8)——实现ISearchable接口》中我将介绍一下如何实现ISearchable接口,让DNN能够找到该模块中的数据并实现文章聚合功能。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多