-
c#开发DotnetNuke初试三
四,添加代码
在本系列的第一篇中,我们先学习了建立数据库脚本,大家把那段代码拷贝到“~DesktopModulesFantom"文件夹下的“01.00.00.SqlDataProvider”文件中,把这个文件中原有的东西都去掉。
在App_Code下的Fantom文件夹中建立两个类,一个是实体类"ArticleInfo.cs",另一个是实体操作类"ArticleController.cs"。其内容暂时先别管,先在此文件夹个的"DataProvider.cs"文件中的抽象方法(Abstract Method)中添加如下新方法:
public abstract void AddArticle(string Title, string Content,DateTime CreateTime ,string Author);
public abstract void DeleteArticle(int Id);
public abstract void UpdateArticle(int Id, string Titlec, string Content,DateTime CreateTime ,string Author);
public abstract IDataReader GetArticleById(int Id);
public abstract IDataReader GetAll();
然后在继承它的类"SqlDataProvider.cs"中实现这些抽象方法,代码如下:
public override void AddArticle(string Title, string Content,DateTime CreateTime, string Author)
{
SqlHelper.ExecuteNonQuery(ConnectionString, GetFullyQualifiedName("F_ARTICLE_CREATE"), Title, Content,CreateTime, Author);
}
public override void DeleteArticle(int Id)
{
SqlHelper.ExecuteNonQuery(ConnectionString, GetFullyQualifiedName("F_ARTICLE_DELETE"), Id);
}
public override void UpdateArticle(int Id, string Titlec, string Content,DateTime CreateTime, string Author)
{
SqlHelper.ExecuteNonQuery(ConnectionString, GetFullyQualifiedName("F_ARTICLE_UPDATE"), Id, Titlec, Content,CreateTime, Author);
}
public override IDataReader GetArticleById(int Id)
{
return SqlHelper.ExecuteReader(ConnectionString, GetFullyQualifiedName("F_ARTICLE_GETDETAILS"), Id);//F_ARTICLE_GETDETAILS
}
public override IDataReader GetAll()
{
return SqlHelper.ExecuteReader(ConnectionString, GetFullyQualifiedName("F_ARTICLE_GETALL"));
}
回头再来看我们之前添加的类"ArticleInfo.cs",添加其代码如下:
using System;
在类"ArticleController.cs"中写下如下代码:
/**//// <summary>
/// ArticleInfo 的摘要说明
/// </summary>
namespace Fantom.Modules.MyModule
{
public class ArticleInfo
{
private int _id;
private string _title;
private string _content;
private DateTime _createTime;
private string _author;
public ArticleInfo()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public ArticleInfo(int id, string title, string content, DateTime createTime, string author)
{
_id = id;
_title = title;
_content = content;
_author = author;
_createTime = createTime;
}
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Title
{
get { return _title; }
set { _title = value; }
}
public string Content
{
get { return _content; }
set { _content = value; }
}
public DateTime CreateTime
{
get { return _createTime; }
set { _createTime = value; }
}
public string Author
{
get { return _author; }
set { _author = value; }
}
}
}
Code
1using System;
在配置文件"MyModule.dnn"中我们可能看到,"App_code"文件夹下的类都在此注册一个,我们也照猫画虎,把我们自己写的类也在此注册如下:
2using DotNetNuke;
3using DotNetNuke.Common;
4using DotNetNuke.Common.Utilities;
5using DotNetNuke.Entities.Modules;
6using DotNetNuke.Services.Search;
7using System.Collections.Generic;
8
9/**//// <summary>
10/// ArticleController 的摘要说明
11/// </summary>
12///
13namespace Fantom.Modules.MyModule
14{
15 public class ArticleController
16 {
17 public ArticleController()
18 {
19 //
20 // TODO: 在此处添加构造函数逻辑
21 //
22 }
23
24 Public Methods#region Public Methods
25 public static void AddArticle(ArticleInfo article)
26 {
27 DataProvider.Instance().AddArticle(article.Title, article.Content, article.CreateTime, article.Author);
28 }
29
30 public void DeleteArticle(int articleId)
31 {
32 DataProvider.Instance().DeleteArticle(articleId);
33 }
34
35 public void UpdateArticle(ArticleInfo article)
36 {
37 DataProvider.Instance().UpdateArticle(article.Id, article.Title, article.Content, article.CreateTime, article.Author);
38 }
39 public static ArticleInfo GetArticleById(int articleId)
40 {
41 return CBO.FillObject<ArticleInfo>(DataProvider.Instance().GetArticleById(articleId));
42 }
43 public static List<ArticleInfo> GetArticleAll()
44 {
45 return CBO.FillCollection<ArticleInfo>(DataProvider.Instance().GetAll());
46 }
47 #endregion
48 }
49}
<file>
到此为止,我们就短在用户界面上调用这些类中的方法来实现各种功能。这里我们主要用到ViewMyModule.ascx控件,打开这个控件,把源代码改成如下如示:
<path>[app_code]</path>
<name>ArticleController.cs</name>
</file>
<file>
<path>[app_code]</path>
<name>ArticleInfo.cs</name>
</file>
<%@ Control language="C#" Inherits="Fantom.Modules.MyModule.ViewMyModule" CodeFile="ViewMyModule.ascx.cs" AutoEventWireup="true"%>
<asp:Panel ID="Panel1" runat="server" Height="295px" Width="399px"><div>
Title: <br />
<asp:TextBox ID="txtTitle" runat ="server" Width="100%"></asp:TextBox></div>
<div>
Author:<asp:TextBox ID="txtAuthor" runat="server" Width="100%" ></asp:TextBox></div>
<div>
Content:<asp:TextBox ID="txtContent" runat="server" Height="234px" Width="100%" TextMode="MultiLine"></asp:TextBox></div><div><asp:Button ID="btnAdd" Text="Add" runat="server" Width="59px" OnClick="btnAdd_Click" /></div>
</asp:Panel><hr />
最后在"ViewMyModule.ascx.cs"文件中添加"btnAdd"的代码,实现添加文章功能。代码如下:
protected void btnAdd_Click(object sender, EventArgs e)
{
try
{
string title = this.txtTitle.Text.Trim();
string content = this.txtContent.Text.Trim();
string author = this.txtAuthor.Text.Trim();
DateTime createTime = DateTime.Now;
ArticleInfo ai = new ArticleInfo();
ai.Title = title;
ai.Content = content;
ai.Author = author;
ai.CreateTime = createTime;
ArticleController.AddArticle(ai);
this.txtTitle.Text = "";
this.txtContent.Text = "";
Response.Write("<script>alert('添加成功!')</script>");
}
catch (Exception exe)
{
Response.Write("<script>alert('添加失败,原因是:'"+ exe.Message+")</script>" );
}
}
大家运行一下,如果没有编译错误的就对了。到最后还要大家改动两个地方,大家照猫画虎,先改了,有兴趣的话可以研究一下。一个是"DataProvider.cs"中找到objProvider = (DataProvider)Reflection.CreateObject("data", "YourCompany.Modules.MyModule", "");把"YourCompany"改成"Fantom"(要是提高改了更好),还有一处是把"SqlDataProvider.cs“文件中的"private const string ModuleQualifier"的值改为空("")。
五,压缩上传
压缩要"zip"格式的,把整个项目压缩成Fantom.zip.然后在DNN的"主机管理"下的"模块定义"中选择"上传新模块",把刚刚压缩的Fantom.zip上传。
返回"模块定义"页面,选择MyModule模块前的编辑按钮,进入编辑页面,把三个控件的路径改成"DesktopModules/Fantom.MyModule/Fantom/DesktopModules/Fantom/“(如ViewMyModule.ascx的路径就为:DesktopModules/Fantom.MyModule/Fantom/DesktopModules/Fantom/ViewMyModule.ascx).
到此为止,所有的一切都做好了,就剩下在页面中添加这个控件了。至于添加和试用控件这里我就不再多说废话了,大家去试试吧。添加成功后要弹出一个对话框说明添加成功,但我这头的DNN弹出的是四个乱码字符加一个叹号(失败的消息是一串字符),因为时间原因,我还没有解决这个问题,大家有兴趣可以完善。到这里,我们的项目建立完毕。
结束语:本文只是一个最基本的例子,旨在能够实现C#建立DNN模块,总体来说没什么技术含量,只是让大家能够明白一些建立过程中的细节。由于暂时我们不用DNN做项目,而本人又没有时间加以研究,所以目前也只能做到这一步了。但我希望有更多的这方面的文章在园子里出现。
回头再来看我们之前添加的类"ArticleInfo.cs",添加其代码如下:
using System;
在类"ArticleController.cs"中写下如下代码:
/**//// <summary>
/// ArticleInfo 的摘要说明
/// </summary>
namespace Fantom.Modules.MyModule
{
public class ArticleInfo
{
private int _id;
private string _title;
private string _content;
private DateTime _createTime;
private string _author;
public ArticleInfo()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public ArticleInfo(int id, string title, string content, DateTime createTime, string author)
{
_id = id;
_title = title;
_content = content;
_author = author;
_createTime = createTime;
}
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Title
{
get { return _title; }
set { _title = value; }
}
public string Content
{
get { return _content; }
set { _content = value; }
}
public DateTime CreateTime
{
get { return _createTime; }
set { _createTime = value; }
}
public string Author
{
get { return _author; }
set { _author = value; }
}
}
}