我是最近才开始学习dnn的,接到的第一个任务就是开发dnn的模块。最近有朋友问我开发的步骤,我想还是把它写在blog上,一方面为了共享资源,一方面是希望能够得到dnn开发高手的指点。
在模块的开发上,我采用的方案:
界面层和代码层完全分开。
至于采用这个方案,对我来说并不是偶然的,因为我之前从来没有做过asp或是asp.net的开发,所以我对asp.net的界面表示层不感兴趣。所以我将模块的执行代码放到了另外一个工程中。不过这一点还是要得益于asp.net的框架,如果是在asp下面,这种开发模式是不可能的。
由于我的文字功底很差劲,所以,有表达不清楚的地方,大家可以用qq,msn或是email交流。
首先,打开工程模板,创建建一个dnn站点(图1),说明一下,由于我演示的是一个已经建好的dnn站点,所以多了一个DesktopModules文件夹,在最开始创建站点的时候,这个文件夹是不存在的,这个文件夹就是用来存放DNN Module的文件夹。
图1
然后,通过工程向导,添加Dnn模块,在这里,我选择的是C#,因为我个人比较喜欢用C#。在这里我创建一个Request模块图2
图2
当模块添加之后,你要将模块所在的文件夹名称改为模块名称,即将ModuleName改为Request。图3
图3
在这里一个模块的添加就算完成了,但是如果要将模块的执行代码放到另外一个工程中,我们还要做一些工作。
在这里,我另外新建一个class library工程,叫做HGG.Request。我这样命名只是为了项目管理,在技术上没有其它什么意思。图4,图5,由于显示的原因,我把图片分成了两截。
图4
图5
大家可以发现,每个页面对应的cs文件被移到了HGG.Request工程中,除此之外,还有数据处理文件也被移动到了这个里面。
那么这两个工程是如何关联起来的呢,以EditRequest.aspx文件为例,在最初由工程向导生成这个文件的时候,代码是这样的:
<%@ Control language="C#" Inherits="YourCompany.Modules.Request.EditRequest" CodeFile="EditRequest.ascx.cs" AutoEventWireup="true"%>
而当我把执行代码放到HGG.Request工程中后,我必须对上面的这段代码做如下调整:
<%@ Control Language="C#" Inherits="HGG.Modules.Request.EditRequest" AutoEventWireup="false"
Explicit="True" %>
最关键的变化是删除了CodeFile设置,修改了Inherits设置。简单的说,HGG.Modules.Request.EditRequest就是在HGG.Request工程中,处理EditRequest.aspx的类,这个类名称叫EditRequest,名称空间为HGG.Modules.Request。
做完了上面的这一步,我们基本上就完成了表现层和代码层的分离工作。下面的问题是这两层如何通信。
关于这一点,asp.net做得非常的强,.net框架上有动态的事件绑定,这样的技术在asp.net中同样有效。
例如,在Request.aspx上有一个button:
<div style="float: left;">
<asp:LinkButton ID="PreviousLink" runat="server" Text="Previous" CssClass="Normal" />
</div>
如果我们要处理它被点击后的事件,那么在HGG.Request工程中的Request.cs文件中,我们要做以下事情
1、在页面加载时,定义事件绑定:
//声明事件绑定
private void RegisterEvents()
{
SearchButton.Click += new EventHandler(SearchButton_Click);
PreviousLink.Click += new EventHandler(PreviousLink_Click);
NextLink.Click += new EventHandler(NextLink_Click);
this.Load += new EventHandler(EditRequest_Load);
}
//定义事件的处理代码
private void PreviousLink_Click(object sender, EventArgs e)
{
MovePage(SegmentData, false);
}
在这里,PreviousLink在这个类中,是一个属性,我通过这个属性来获取Request.aspx上PreviousLink的引用,在这里,HGG.Request中的Request类就和Dnn网站上的Request.aspx联系起来了。那么这个属性是如何定义的呢?下面是它的代码:
private LinkButton PreviousLink
{
get
{
return (LinkButton)FindControl("PreviousLink");
}
}
这就是关键。
其它的我想我这里就不必多说了,几乎一般的windows类库开发模式一样。
好了,这篇文章在这里就结束了,希望我说清楚了,不清楚的地方,欢迎讨论。
(最近我也在学习做dnn的皮肤)