日志列表的管理也包括添加、修改和删除,在这里制作的用户控件名称为ucAdmin_Log.ascx,其页面的布局如图1-17所示。
图1-17 布局日志列表
这里同样使用了GridView控件,这也是该控件最擅长的。单击下方的“添加新日志”链接将会打开LogAdd.aspx页,如果单击的是“编辑”链接将会转到LogModify.aspx页,当单击“删除”链接时会直接删除该行。
1.显示日志列表
GridView控件的ID是gvLog,这里绑定数据并显示是由gbind1()方法完成的,如下所示:
void gbind1()
{
dbconfig dbconn = new dbconfig();
gvLog.DataSource = dbconn.CreateSource("select * from info");
gvLog.DataBind();
dbconn.Clear();
}
对于“删除”链接的实现可以参考日志分类中的代码,这里不再介绍。下面列出了单击“编辑”链接时调用的gvLog_RowEditing()方法的代码:
protected void gvLog_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow gvr = (GridViewRow)gvLog.Controls[0].Controls[e.NewEditIndex+1];
int id = int.Parse(gvr.Cells[0].Text);
Response.Redirect("LogModify.aspx?id="+id);
}
从上述代码中可以看到,首先获取要编辑的行,再获取行中日志编号的值,然后将这个值传递给LogModify.aspx页面的id参数,这个页面我们会稍后介绍。
2.添加日志
添加日志时可以指定新日志的标题、所属的栏目、日志的摘要、日志的作者、是否置顶显示、日志链接、日志的引用地址以及日志的正文内容,其中默认打开时只显示前3项,单击“高级选项”按钮则可以打开完整模式,如图1-18所示为页面的布局。
图1-18 布局添加日志页面
在图1-18所示的布局中日志的摘要和内容都是使用的第三方控件FreeTextBox控件,这个控件是一个免费的.NET HTML编辑器,读者可以到http://freetextbox.com/download/网址下载最新版本,在页面中使用FreeTextBox控件之前,应该先在项目中添加对该控件DLL文件的引用。具体的操作如下:
(1)通过下载得到FreeTextBox控件的压缩包并解压。
(2)打开项目,在【解决方案资源管理器】窗格中右击项目名称选择【添加引用】命令,打开【添加引用】对话框。
(3)在对话框中通过【浏览】选项卡选择解压包中的FreeTextBox.dll文件,再单击【确定】按钮,如图1-19所示。
图1-19 添加引用
(4)复制解压包中的ftb.imagegallery.aspx到要使用FreeTextBox的目录(当然可以是其他,但是可能要设置路径)。
(5)像使用普通控件一样,将它添加布局并修改控件的其他属性。这时打开源代码视图,会在页面的顶部找到如下代码:
<%@ Register TagPrefix="FTB" Namespace="FreeTextBoxControls" Assembly="FreeTextBox" %>
这行为FreeTextBox控件的注册代码,指定使用的程序集、命名空间和引用标签。添加控件后会生成类似如下的代码:
<FTB:FreeTextBox ID="Free1" ImageGalleryPath="~/ImageAdmin"
runat="server" Text='' Language="zh-CN"
ButtonDownImage="True" Height="200"
ToolbarLayout="ParagraphMenu,FontFacesMenu,FontSizesMenu,FontForeColorsMenu|Bold,Italic,Underline,Strikethrough;Superscript,Subscript,RemoveFormat|JustifyLeft,JustifyRight,JustifyCenter,JustifyFull;BulletedList,NumberedList,Indent,Outdent;CreateLink,Unlink,InsertImage,InsertImageFromGallery,InsertRule|Cut,Copy,Paste;Undo,Redo,Print">
</FTB:FreeTextBox>
属性Language="zh-CN"指定控件显示的提示为简体中文,它还自带了多种语言,可参见帮助文件修改。
添加日志是博客系统的核心功能,而且是管理员的特权。打开LogAdd.aspx页面的后台代码,在Page_Load中添加如下所示代码:
dbconfig dbconn = new dbconfig();
protected void Page_Load(object sender, EventArgs e)
{
if (Session["admin"] == null)
{
Response.Redirect("Log_Admin.aspx");
}
if (!IsPostBack)
{
DropDownList1.DataSource = dbconn.CreateSource("select id,sortName from infosort");
DropDownList1.DataBind();
}
}
第二个if中的语句将日志分类信息绑定到下拉列表框,供管理员选择新日志的类别,DropDownList1是下拉列表框的ID,它的布局代码如下所示:
<asp:DropDownList ID="DropDownList1" runat="server" Width="200px" DataTextField="sortName" DataValueField="id">
<asp:ListItem Value="0" Selected="True"></asp:ListItem>
</asp:DropDownList>
DataTextField属性指定在列表框中显示的文本为sortName(日志类别名称)字段的数据,DataValueField属性指定在选择后得到的值为id(日志类别编号)字段的数据。
最后介绍单击“发布”按钮后添加日志的代码,这些代码可分为三个过程,首先获取用户输入的新日志数据,再针对这些数据进行处理,然后添加到数据库并返回。完整的实现代码如下所示,在代码中包含一些重要注释:
string strSQL,Title,Abstrack,Content,Author,Link,IP,URL;
int SortId,HomeTop;
protected void btnAdd_Click(object sender, EventArgs e)
{
Abstrack = digest.Text; //获取摘要内容
Title=title.Text; //获取标题
Content = Free1.Text; //获取正文内容
Author = author.Text;
Link = link.Text;
IP = Request.UserHostAddress; //获取IP地址
URL = url.Text;
SortId =System.Int16.Parse(DropDownList1.SelectedValue); //获取类别编号
HomeTop=hometop.Checked ? 1 : 0; //是否置顶
strSQL = "insert into info(title,author,abstract,content,sortId,link,[date],ip,homeTop,url) values(";
strSQL+="'"+ Title + "','"+Author+"','"+Abstrack+"','"+Content+"',"+SortId +",'"+ Link+"',";
strSQL+="'"+DateTime.Now.ToString()+"','"+IP+"'," +HomeTop+",'"+URL+"')";
dbconn.ExecuteNonQuery(strSQL);
dbconn.Clear();
Response.Write("<script>alert('添加成功');window.location.href='Default.aspx';</script>");
}
3.修改日志
当单击“编辑”按钮就会跳转到修改页面,这个页面中除了需要一个id参数指修改日志的编号外,还需要对权限进行验证,以及绑定显示日志的类别,这些可参考LogAdd.aspx页的Page_Load()方法。如图1-50所示为修改日志时的效果。
图1-20 修改日志
如图1-20所示,修改页面LogModify.aspx要完成两大功能,第一个是在页面载入时读取日志的内容并显示,另一个则是再单击“保存修改”按钮后更新日志的数据。第二个功能与添加日志相似这里不再介绍,下面介绍读取日志的实现,主要是使用了自定义的方法getContent(),代码如下:
void getContent() {
string strsql = "select * from info where id=" + Request["id"];
dbconfig dbconn = new dbconfig();
SqlCommand cmd=new SqlCommand(strsql,dbconn.conn);
SqlDataReader dr=cmd.ExecuteReader();
if(dr.Read())
{
title.Text = dr["title"].ToString(); //标题
author.Text = dr["author"].ToString();
digest.Text = dr["abstract"].ToString(); //摘要
Free1.Text = dr["content"].ToString(); //正文
string sortid = dr["sortID"].ToString();
DropDownList1.SelectedValue = sortid; //日志分类
link.Text = dr["link"].ToString();
hometop.Checked = dr["homeTop"].ToString() == "1" ? true : false;
url.Text = dr["url"].ToString();
}
dr.Close();
dbconn.Clear();
}
getContent()方法在页面的Page_Load()方法中调用,然后使用SqlDataReader对象的Read()方法来逐项读取数据并显示,最后关闭连接。