日誌列表的管理也包括添加、修改和刪除,在這裏製作的用戶控件名稱爲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()方法來逐項讀取數據並顯示,最後關閉連接。