所谓其他模块指的是在系统首页中除了主体日志之外的模块,从图1-3所示的效果中可以看到这些模块包括:日志分类、最新日志和最近评论。这些模块与母版页一样,在每个页面中都会有显示,设计时将这些模块分别封装为成同的用户控件,再嵌入到母版页中,具体的实现如下所示。
1.日志分类
用户控件最简单的一个定义是ASP.NET布局代码中可重用的部分,它以.ascx为扩展名进行保存。创建用户控件非常简单,它们来本是ASP.NET页页的一部分,被封装在一个单独的文件中,可在一个应用程序中根据需要多次重用。编写用户控件和编写aspx页面方法一样,我们只需要在aspx页面中编写代码就能够使用它们。用户控件还可以引发自定义事件,由客户端用户来响应事件以调用处理方法。
下面介绍创建日志类别用户控件的步骤:
(1)在【解决资源管理器】窗格中右击选择【添加新项】命令或者选择【网站】|【添加新项】命令,打开【添加新项】对话框。
(2)在对话框的【模板】选项区中单击【Web用户控件】选项,在【名称】文本框中Web用户控件的默认名为WebUserControl1.ascx,这里修改文件名为ucLogCategory.ascx。从【语言】列表框选择Visual C#项。
(3)单击【添加】按钮,VS.NET将在网站所在的根目录中创建ucLogCategory.ascx文件。创建完成后会自动打开用户控件的HTML【源】视图,并显示一行代码,如下所示:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucLogCategory.ascx.cs" Inherits="ucLogCategory" %>
(4)这里会发现与ASPX页面非常相似,不同是仅是没有太多的模板代码。而且使用的是@Control指令,该指令表示所生成的类是从System.Web.UI.UserControl继承,并可以将此控件用于窗体中。
(5)切换至用户控件的【设计】视图,然后添加Repeater控件、图片和其他布局代码,如图1-6所示为最终日志类别的运行和布局效果。
图1-6 日志类别用户控件
打开用户控件的后台文件ucLogCategory.ascx.cs,编写实现图1-6左所示效果的代码。日志分类的数据来自infosort表,实现代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dbconfig dbconn = new dbconfig();
String sql = "SELECT id,sortname FROM infosort";
dbconn.da = new SqlDataAdapter(sql, dbconn.conn);
DataSet ds = new DataSet();
dbconn.da.Fill(ds, "Table");
repLogCate.DataSource = ds.Tables["Table"].DefaultView;
repLogCate.DataBind();
ds = null;
dbconn.Clear();
}
}
在代码中可以看出显示数据日志分类Repeater控件的ID是repLogCate,在同一个页面中要以避免使用相同的ID,而且在后台代码中,也仅为一个ID指定一个数据源。
2.最新日志
最新日志模块使用的用户控件名称为ucLogNews.ascx,添加方法这里就不再介绍,其布局与日志分类模块相似,如下所示是这部分的布局代码:
<asp:Repeater ID="repNewLogs" runat="server">
<HeaderTemplate>
<div class="border1">
<div class="lefttitle">最新日志</div>
<div class="msg">
<ul class="msgtitlelist" id="pl">
</HeaderTemplate>
<ItemTemplate>
<li><a href='ShowLog.aspx?id=<%#DataBinder.Eval(Container.DataItem,"id")%>'>
<%#DataBinder.Eval(Container.DataItem, "title")%></a></li>
</ItemTemplate>
<FooterTemplate>
</ul></div></div>
</FooterTemplate>
</asp:Repeater>
这里明确指定了最新日志使用ID是repNewsLgs的Repeater控件,其显示的数据来自info表的id和title两个字段,数据的数量为按发表时间排序的前5条,如下所示是实现代码:
if (!IsPostBack)
{
dbconfig dbconn = new dbconfig();
String sql = "SELECT top 5 id,title FROM info order by [date] desc";
dbconn.da = new SqlDataAdapter(sql, dbconn.conn);
DataSet ds = new DataSet();
dbconn.da.Fill(ds, "Table");
repNewLogs.DataSource = ds.Tables["Table"].DefaultView;
repNewLogs.DataBind();
ds = null;
dbconn.Clear();
}
3.最近评论
ucLogComment.ascx是实现显示最近评论的用户控件,它包含了名为repComment的Repeater数据控件,数据来自comment表,具体代码如下所示:
if (!IsPostBack)
{
dbconfig dbconn = new dbconfig();
String sql = "SELECT top 5 id,content,sortid FROM comment order by [date] desc";
SqlCommand command = new SqlCommand(sql, dbconn.conn);
SqlDataReader dr = command.ExecuteReader();
repComment.DataSource = dr;
repComment.DataBind();
dbconn.Clear();
}
至此,一个完整的系统首页就制作完成了,它包含了先创建通用的母版页,再添加内容页,然后再添加显示布局,实现时使用了通用的数据库类。通过首页的制作,读者的重点是掌握如何创建母版页、内容页、用户控件。因为在本章的后面,将多次用到它们,到时将不再重复介绍。