用CodeSmith及DNNProjectTemplates进行DNN模块开发(2)

三.数据提供者(Data Providers

至此,VS.NET模板已经创建了一些通用的代码,并且在大多数情况下需要一些修正。正如你猜测的那样,该模板并不关注你使用的是什么表、什么数据库,因此所有的数据库相关的代码应该被提炼出来。

现在我们将构建SqlDataProvider代码。打开CodeSmith,使用VB SqlDataProvider.cst模板。输入和存储过程相同的选择,并生成代码。拷贝新代码到文件SqlDataProvider.vb中。只替代最后部分的代码,在那部分
定义了所有HelloWorld相关的方法。保存文件并关闭。
 
我们已经完成了这部分,并不是很困难吧!
 
 

四.数据提供者抽象层(Data Provider Abstract Layer)

 
下一个需要的步骤是构建数据提供者抽象层(Data Provider Abstract Layer(DAL))。这部分将把我们的模块从使用的真实数据库中抽象出来。如果你想增加对另一个数据库的支持,你只需要为该数据库(表和存储过程)生成相关的DataProviders(正如最后一步)和特定的代码即可。
 
打开CodeSmith并找到Vb DataProvider.cst模板。使用和前一步相同的选择并拷贝生成的代码到 DataProvider.vb文件中。再一次只替代最后部分的代码,在那里定义了抽象方法。


五.业务层(Business Layer 

DotNetNuke使用自定义业务对象作为一种与数据层通讯的方式,因此为了能够与前面建立的表一同工作,我们需要创建这些对象。

包括这两步:

1.   生成支持业务对象的类;

2.   生成定义可使用操作的控制器类;

在先前版本中(DNNProjectTemplates 2.X,这两个类包含在同一个文件中。在DotNetNuke 3.X中通用的做法是把两个类分割成单独的类文件。

下一步,执行名为“Vb BLL Controller Class.cst”的模板。产生的代码应该拷贝到你的主模块项目的HelloWorldController.vb中。

这里你可以看到除了两个属性的常用选择:NameSpaceClassNameSpaceData。这里你应该用你实际的项目名称来代替“PA”(Private Assembly)部分,即这里的HelloWorld

         注意:如果使用“Get”作为你的“SelectPrefix”(选择前缀),你应当把“Get”方法放置在“[ ]”中,因为在VB.NET中“Get”是保留关键字。

 

六.视图控制(View Control

我们从简单的部分开始:只生成一个视图控制并测试它是否工作。打开HelloWorld.ascx并添加一个Label(名为Label1),设置属性text为“HelloWorld says Hello to:”,添加一个dataGrid(名为DataGrid1)。为了使情况变得有趣,我们在一个模板列中增加一个超链接控件。你的代码应当看起来是这个样子:

Example 1. 

<asp:Label id="Label1" runat="server">

  HelloWorld says hello to:

</asp:Label>

<aspataGrid id="DataGrid1" runat="server">

  <Columns>

    <asp:TemplateColumn>

      <ItemTemplate>

        <asp:HyperLink id="Hyperlink1" runat="server"

           Visible='<%# IsEditable %>'

           NavigateUrl='<%# EditUrl("itemid",
               DataBinder.Eval(Container.DataItem,"ItemID")) %>'>

          <asp:Image id="Image3" ImageUrl="~/images/edit.gif"

               AlternateText="Edit" Visible="<%# IsEditable %>"
               Runat="server" />

        </asp:HyperLink>

      </ItemTemplate>

    </asp:TemplateColumn>

  </Columns>

</aspataGrid>  

    

把如下代码添加到 Page_Load函数中:

Example 2. 

Private Sub Page_Load(....) Handles MyBase.Load

    Try

        Dim objHelloWorld As New HelloWorldController

        Dim list As ArrayList

        If Not Page.IsPostBack Then

            list = objHelloWorld.GetByModules(ModuleId)

            Label1.ControlStyle.Font.Bold = CType(Settings("HelloBold"), Boolean)

            DataGrid1.DataSource = list

            DataBind()

        End If

    Catch exc As Exception

        ProcessModuleLoadException(Me, exc)

    End Try

End Sub

你会看到模板自动产生名为“Optional Interfaces”的代码区域。这包括被DotNetNuke框架使用的几个属性和方法定义,目的是为了得知如何与模块交互。不要改变任何东西,因为自动生成的代码就可以用了。  

现在编译解决方案。如果你没有出错的话就会毫无错误的编译通过。确信也编译了前边我们创建的项目。  

现在我们将在你的DotNetNuke portal中安装该模块,以host身份登陆,转到模块定义,增加一个模块并定义如下:

(待续)

 
 
 

八.设置控制(Settings Control

作为最后一步,我们将学会如何使用模块的设置控制。该控制将使用标准的DotNetNuke核心特性被添加到模块动作菜单的默认设置选项中。  

打开Settings.ascx用户控件并添加一个CheckBox控件(将它命名为Checkbox1)并设置文本属性为“Header in bold”。  

打开该控件的代码文件并将下面的代码代替LoadSettings中的代码:

Public Overrides Sub LoadSettings()
   Try
        If Not Page.IsPostBack Then
            CheckBox1.Checked = CType(Settings("HelloBold"), Boolean)
        End If
    Catch exc As Exception
        ProcessModuleLoadException(Me, exc)
    End Try
End Sub
 

用下面的代码代替UpdateSettings中的代码:  

Public Overrides Sub UpdateSettings()
    Try
        Dim objModules As New Entities.Modules.ModuleController
        objModules.UpdateModuleSetting(ModuleId, "HelloBold",
             CheckBox1.Checked.ToString)
    Catch exc As Exception
        ProcessModuleLoadException(Me, exc)
    End Try
End Sub
 

现在你可以重新编译项目,测试一下看是否工作正常。增加几条信息并改变模块设置中的粗体选项,看看模块是如何工作的。

 

一切ok!你现在在DotNetNuke 3.X中已经拥有了一个很好的HelloWorld模块。

 

九.打包(Packaging

         如果你打算分发该模块,你应当把所有必需的文件打包到一个zip文件中,并创建一个配置文件(其扩展名为 .dnn)。之后你就可以在任何站点使用DotNetNuke的自动处理来安装该模块。  

         如果你遵从先前的指导的话,压根儿你就不需要修改HelloWorld.dnn文件(你可以在VS.NET中你的项目的Install文件夹下找到该文件)。为了确信该文件的正确性,检查其中列出的文件并查看它们是否和你创建的文件相同。

除了zip文件自身,对于zip压缩文件中的每个文件,确信HelloWorld.dnn包含一节:        

<file>

                   <name>……</name>

</file>  

App_LocalResources文件夹下的文件应该象下面这样列出:  

<file>

         <path>App_LocalResources </path>

         <name>……</name>

</file>  

Zip文件中应当包含如下文件:

  • HelloWorld.ascx
  • HelloWorldEdit.ascx
  • Settings.ascx
  • VMasanas.DNN.Modules.HelloWorld.dll (dll for the module project)
  • VMasanas.DNN.Modules.HelloWorld.SqlDataProvider.dll (dll for the dataprovider)
  • HelloWorld.dnn (install file)
  • icon_HelloWorld_32px.gif
  • module.css
  • HelloWorld.ascx.res (from the App_LocalResources folder)
  • HelloWorldEdit.ascx.res (from the App_LocalResources folder)
  • Settings.ascx.res (from the App_LocalResources folder)

还应该包含2个文件:

  • 01.00.00 .SqlDataProvider。该文件包含第四步(数据库DataBase)中产生的代码。还记得我们把那些代码保存到一个文件中吗?把这些生成的代码复制到该文件中并把它包含在zip压缩文件中。名称的第一部分应当和dnn文件(<version>01.00.00</version>)中的数字相同。该文件会在这个私有程序集(PA)被安装到DotNetNuke中时执行。你也必须添加sql脚本来创建在该指南中我们先前创建的HelloWorld表(你可以使用VS.NET或企业管理器来生成该表的创建脚本)。在生成的脚本中你应当移除所有对你使用的数据库的引用-数据库拥有者,并用{databaseOwner}替代。同样的,如果你对你所有的DotNetNuke对象(在web.config中所指定)使用了一个对象限定符,你应当把所有的引用用{objectQualifier}来替代。
  • uninstall.SqlDataProvider。你应当把当模块卸载时清理数据库所需要的代码放到这里。在我们的用例中,它应当包含用于存储过程和HelloWorld表的drop语句。  

你会在HelloWorldSqlDataProvider文件夹中找到上述的两个文件。

这是一个在任何给定的DotNetNuke安装中用来创建HelloWorld表的正确的脚本:  

if exists (select * from dbo.sysobjects where id = object_id(
N'{databaseOwner}{objectQualifier}VMasanas_HelloWorld') and
OBJECTPROPERTY(id, N'IsUserTable') = 1)
{databaseOwner}{objectQualifier}VMasanas_HelloWorld
GO

 

if not exists (select * from dbo.sysobjects where id = object_id(
N'{databaseOwner}{objectQualifier}VMasanas_HelloWorld') and
OBJECTPROPERTY(id, N'IsUserTable') = 1)
 BEGIN
CREATE TABLE {databaseOwner}{objectQualifier}VMasanas_HelloWorld (
 [itemID] [int] IDENTITY (1, 1) NOT NULL ,
 [moduleID] [int] NOT NULL ,
 [message] [nvarchar] (50) NOT NULL
) ON [PRIMARY]
END
 

GO  

ALTER TABLE {databaseOwner}{objectQualifier}VMasanas_HelloWorld
WITH NOCHECK ADD
 CONSTRAINT [PK_VMasanas_HelloWorld] PRIMARY KEY  CLUSTERED
 (
  [itemID]
 )  ON [PRIMARY]
GO
 

ALTER TABLE {databaseOwner}{objectQualifier}VMasanas_HelloWorld ADD
 CONSTRAINT [FK_VMasanas_HelloWorld_Modules] FOREIGN KEY
 (
  [moduleID]
 ) REFERENCES {databaseOwner}{objectQualifier}Modules (
  [ModuleID]
 ) ON DELETE CASCADE
GO
 

你需要用一个干净的,没有安装HelloWorldDotNetNuke站点来测试私有程序集安装包。

(全文完!)



4-09-2006 10:17 上午举报 

(接上面的)

第一个控制应当被定义为 Type=View ;编辑控制的类型应当为 Type=Edit ;设置控制应当设置为 Type=Admin

一旦模块被正确定义之后,我们就可以测试看它如何工作。把 HelloWorld 模块添加到任意页中,看看有什么情况发生。如果顺利的话,你应该只能看到消息“ HelloWorld says hello to: ”。因为数据库中的表里还没有任何记录因此 DataGrid 中什么也不显示。  

下一步我们将学习如何调整编辑控制以便于我们能够添加并修改 HelloWorld 表中的记录。  

七.编辑控制(Edit Control

这一步我们将修改 HelloWorldEdit 控件以便于我们能够往数据库表中添加以及修改工作项。打开 HelloWorldEdit.ascx 。就象你看到的那样,它已经包含了默认的命令按钮在任何编辑屏幕中来执行通用的过程: Update,Delete Cancel  

添加一个 textBox 控件到该自定义控件中并命名为 txtMessage 。现在打开该控件的后台代码。  

如果你遵循该指南的所有步骤,该页中大多数自动生成的代码会起作用。。我们只添加很少量的更新:  

1.   Page_Load 方法中的 ’Load Data 注释后面添加如下代码 :

txtMessage.Text = objHelloWorld.message  

这会从数据库获取消息并在 textbox 中显示出来。

2.   cmdUpdate_Click 方法的注释 bind text values to Object 后面添加如下代码 :  

objHelloWorld.message = txtMessage.Text  

在更新我们当前的记录到数据库之前我们要设置我们自定义业务对象的参数为用户输入的实际值。我们也同样设置当前编辑记录( itemId )和 ModuleId (作为当前模块的引用,如果想在你的站点中能够拥有该模块的多个实例,并关联记录到每一个特定的模块实例,这样做很有必要)。  

这就是这一步中所有要做的。重新编译解决方案,并浏览你的 web 站点。你现在应该能够增加新的消息,并编辑和删除现存的某一个。为了打开你的 DotNetNuke 中的 HelloWorld 模块的编辑控件,站点( portal )使用模块动作菜单( module actions menu )。  

你可能已经注意到,该菜单的第一项既有可能为空,也有可能包含如下文本: RESX:AddContent.Action 。在这里你究竟会看到什么样的内容最终依赖于 web.config 中的一项设置: ShowMissingKeys 如果它设置为“ true ”,你会看到 RESX:AddContent.Action 信息,否则它将会是一个空的入口。  

DotNetNuke 版本 3 支持静态本地化。这是什么意思呢? DotNetNuke 核心框架(以及在任何第三方模块如你的 HelloWorld 中)的所有文本,并不依赖于最终用户所输入的内容(因为名称为静态内容),因此可以被翻译为当前活动用户使用的语言。这是通过添加所有的本地化字符串到一个资源文件中来实现的。资源文件是为在 DotNetNuke 中某个给定的控件所使用的所有字符串提供本地化值的一种方式(如果这里你需要更多的信息,请查阅 DotNetNuke 文档)。每一个 DotNetNuke 控件应当在控件文件夹下的 App_LocalResources 文件夹中 拥有一个相关的资源文件。  

你只需要添加引用健值到字符串中(在 AddContent.Action 中)并适当的翻译到正确的文件中。因此,在文件夹 App_localresources 中打开 HelloWorld.ascx 文件并添加一个入口点,名为 AddAction.Content 值为 Edit Message (确保在这里使用准确的名称,因为健值是大小写敏感的)。  

保存文件,重新打开站点,现在你应当会在模块动作菜单中看到正确的文本。
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值