相關(guān)文章:ASP.net文章管理系統(tǒng):系統(tǒng)設(shè)計與編碼(上)
14.3.4 ArticlesList.aspx的設(shè)計與編碼
ArticlesList.aspx提供了兩個功能:
(1)根據(jù)傳入?yún)?shù)列出該類別的文章列表;
(2)根據(jù)傳入?yún)①悪z索出符合條件的文章列表。
這兩個功能的實現(xiàn)是有后臺邏輯程序根據(jù)傳入的參數(shù)類型判斷,然后為用戶提供不同的服務。
ArticlesList.aspx的HTML代碼如下:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="ArticlesList.aspx.vb" Inherits="TheArticleSYS.ArticlesList"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<meta name="vs_snapToGrid" content="False">
<title>ArticlesList</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content=" </HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<center>
<TABLE id="Table1" style="BORDER-RIGHT: #009999 1px solid; BORDER-TOP: #009999 1px solid; BORDER-LEFT: #009999 1px solid; BORDER-BOTTOM: #009999 1px solid"
cellSpacing="0" cellPadding="0" width="760" border="1">
<TR>
<TD><IMG src="images/bg12.jpg"></TD>
</TR>
<TR>
<TD><FONT face="宋體"></FONT></TD>
</TR>
<TR>
<TD>
<TABLE id="Table2" style="BORDER-RIGHT: #006600 1pt solid; BORDER-TOP: #006600 1pt solid; BORDER-LEFT: #006600 1pt solid; BORDER-BOTTOM: #006600 1pt solid"
cellSpacing="0" cellPadding="0" width="762" border="0">
<asp:datalist id="DataList1" runat="server" BorderColor="#009999" BorderWidth="1pt">
<AlternatingItemStyle BackColor="Azure"></AlternatingItemStyle>
<HeaderStyle Font-Size="Larger" Font-Bold="True" ForeColor="Azure" BackColor="#009999"></HeaderStyle>
<ItemTemplate>
<tr>
<TD align="left" style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; BACKGROUND-COLOR: darkgray">標題:
<a href='<%# "TheArticle.aspx?aid="&databinder.eval(container.dataitem,"id") %>' target=_blank >
<%# databinder.eval(container.dataitem,"title") %>
</a>
</TD>
</tr>
<tr>
<TD align="left" style="FONT-SIZE: 11pt; BACKGROUND-COLOR: lightgrey">
id:<%# databinder.eval(container.dataitem,"id") %>
作者:<%# databinder.eval(container.dataitem,"writer") %>
---發(fā)布日期:<%# databinder.eval(container.dataitem,"sdate") %>
---瀏覽次數(shù):<%# databinder.eval(container.dataitem,"views") %>
</TD>
</tr>
<tr>
<TD align="left" style="FONT-SIZE: 11pt; BACKGROUND-COLOR: lightgrey">關(guān)鍵字[<%# databinder.eval(container.dataitem,"keyword") %>]</TD>
</tr>
<tr>
<TD align="left" style="TEXT-INDENT: 10pt; BACKGROUND-COLOR: seashell">
內(nèi)容摘要:<br>
...<%# mid(databinder.eval(container.dataitem,"content"),50,200) %>...<br>
</TD>
</tr>
</ItemTemplate>
</asp:datalist></TABLE>
</TD>
</TR>
<TR>
<TD><FONT face="宋體"><asp:label id="Label1" runat="server"></asp:label><asp:linkbutton id="LinkButton4" runat="server">第一頁</asp:linkbutton>
<asp:linkbutton id="LinkButton1" runat="server">上一頁</asp:linkbutton><asp:linkbutton id="LinkButton2" runat="server">下一頁</asp:linkbutton>
<asp:linkbutton id="LinkButton3" runat="server">末一頁</asp:linkbutton></FONT></TD>
</TR>
</TABLE>
</center>
</form>
</body>
</HTML>
ArticlesList.aspx.vb的后臺邏輯代碼如下:
'---code begin---
Imports System.Web
Imports System.Data
Public Class ArticlesList
Inherits System.Web.UI.Page
#Region " Web 窗體設(shè)計器生成的代碼 "
'此處省略了設(shè)計器生成的無關(guān)代碼,以節(jié)省篇幅
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此處放置初始化頁的用戶代碼
If Not Page.IsPostBack Then
viewstate("pagenow") = 0
Dim akinds As String = Request.Params("akind")
Dim seekid As String = Request.Params("seekid")
Dim infor As String = Request.Params("infor")
Dim moreid As String = Request.Params("moreid")
If moreid = "" Then
If akinds = "" Or seekid = "" Or infor = "" Then
Response.Redirect("default.aspx")
Else
If akinds = "-1" Then
mysql = " where " + seekid + " like '%" + infor + "%'"
Else
mysql = " where akinds=" + akinds + " and " + seekid + " like '%" + infor + "%' "
End If
End If
Else
mysql = " where akinds=" + Request.Params("moreid")
End If
getdatainfor()
getdata()
End If
End Sub
'獲取符合條件的記錄條數(shù)
Sub getdatainfor()
mycon.Open()
Dim mycmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("select count(*) from articles " & mysql, mycon)
viewstate("pagecount") = mycmd.ExecuteScalar
mycon.Close()
If viewstate("pagecount") = 0 Then
Response.Write("<script>alert('\n對不起,沒有查找到符合條件的文章\n');</script>")
Exit Sub
End If
End Sub
'獲取記錄信息
Sub getdata()
Dim mycmd As OleDb.OleDbDataAdapter
Dim dt As DataSet = New DataSet
mycmd = New OleDb.OleDbDataAdapter(" select * from articles" & mysql & " order by id desc ", mycon)
'每頁顯示6篇文章記錄
mycmd.Fill(dt, viewstate("pagenow"), 6, "plist")
DataList1.DataSource = dt.Tables("plist").DefaultView
DataList1.DataBind()
Label1.Text = "共有[<font color=red> " & viewstate("pagecount") & "</font>]篇文章"
Label1.Text += ",當前為第[<font color=red>" & (viewstate("pagenow") + 1)
Label1.Text += "</font>]頁/共[<font color=red>" & (viewstate("pagecount") \ 6 + 1) & "</font>]頁"
mycon.Close()
End Sub
'上一頁, 即:頁碼減1
Private Sub LinkButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
If viewstate("pagenow") > 0 Then
viewstate("pagenow") -= 1
getdatainfor()
getdata()
End If
End Sub
'下一頁, 即:頁碼加1
Private Sub LinkButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton2.Click
If viewstate("pagenow") < viewstate("pagecount") \ 6 Then
viewstate("pagenow") += 1
getdatainfor()
getdata()
End If
End Sub
'第一頁,即:頁碼為0
Private Sub LinkButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton4.Click
If viewstate("pagenow") <> 0 Then
viewstate("pagenow") = 0
getdatainfor()
getdata()
End If
End Sub
'最后一頁
Private Sub LinkButton4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton3.Click
If viewstate("pagenow") < viewstate("pagecount") \ 6 Then
viewstate("pagenow") = viewstate("pagecount") \ 6
getdatainfor()
getdata()
End If
End Sub
End Class
'---code end ----
編譯運行后,結(jié)果如圖14.12所示
14.3.5 TheArticle.aspx和Tealker.ascx的設(shè)計與編碼
TheArticle.aspx是顯示文章具體內(nèi)容的頁面,根據(jù)傳入的文章ID,從數(shù)據(jù)庫中檢索出文章,并把內(nèi)容顯示出來。并利用Tealker.ascx把有關(guān)該文章的評論顯示到頁面中,同時為瀏覽者提供一個發(fā)表評論的入口。
TheArticle.aspx的HTML代碼如下:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="TheArticle.aspx.vb" Inherits="TheArticleSYS.TheArticle"%>
<%@ Register TagPrefix="uc1" TagName="tealker" Src="tealker.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title runat="server" id="Mytitle"></title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content=" </HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<center>
<TABLE id="Table1" style="BORDER-RIGHT: #739cd6 1pt solid; BORDER-TOP: #739cd6 1pt solid; BORDER-LEFT: #739cd6 1pt solid; BORDER-BOTTOM: #739cd6 1pt solid"
cellSpacing="0" cellPadding="0" width="762" background="images/bg10.gif" border="0">
<TR>
<TD></TD>
<TD align="right">
<TABLE id="Table2" style="BORDER-RIGHT: #739cd6 1pt solid; BORDER-TOP: #739cd6 1pt solid; BORDER-LEFT: #739cd6 1pt solid; WIDTH: 680px; BORDER-BOTTOM: #739cd6 1pt solid; HEIGHT: 50px"
cellSpacing="0" cellPadding="0" width="680" border="0">
<TR>
<TD style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: white; HEIGHT: 50px; BACKGROUND-COLOR: #739cd6"
align="center"><asp:label id="Label1" runat="server">Label</asp:label></TD>
</TR>
<TR>
<TD style="BORDER-RIGHT: #739cd6 1pt solid; BORDER-TOP: #739cd6 1pt solid; FONT-SIZE: 10pt; BORDER-LEFT: #739cd6 1pt solid; BORDER-BOTTOM: #739cd6 1pt solid; HEIGHT: 30px; BACKGROUND-COLOR: azure"
align="center"><asp:label id="Label2" runat="server">Label</asp:label></TD>
</TR>
<TR>
<TD style="BORDER-RIGHT: #739cd6 1pt solid; BORDER-TOP: #739cd6 1pt solid; FONT-SIZE: 10pt; BORDER-LEFT: #739cd6 1pt solid; BORDER-BOTTOM: #739cd6 1pt solid; HEIGHT: 30px; BACKGROUND-COLOR: azure"
align="center"><asp:label id="Label4" runat="server">Label</asp:label></TD>
</TR>
<TR>
<TD style="FONT-SIZE: 11pt; LINE-HEIGHT: 20pt"><asp:label id="Label3" runat="server">Label</asp:label></TD>
</TR>
<TR>
<TD style="BORDER-BOTTOM: #009999 thin solid"><br>
</TD>
</TR>
<TR>
<TD><br>
</TD>
</TR>
<TR>
<TD align="center"><uc1:tealker id=Tealker1 runat="server" aid='<%# Request.Params("aid")%>'></uc1:tealker></TD>
</TR>
</TABLE>
<P></P>
</TD>
</TR>
</TABLE>
</center>
</form>
</body>
</HTML>
TheArticle.aspx.vb的邏輯代碼如下:
'---code begin---
Public Class TheArticle
Inherits System.Web.UI.Page
#Region " Web 窗體設(shè)計器生成的代碼 "
'此處省略了設(shè)計器生成的無關(guān)代碼,以節(jié)省篇幅
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此處放置初始化頁的用戶代碼
If Request.Params("aid") <> "" Then
mysql = "select * from articles where id=" + Request.Params("aid")
mycon.Open()
Dim mycmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(mysql, mycon)
Dim myreader As OleDb.OleDbDataReader
myreader = mycmd.ExecuteReader
Do While myreader.Read
'顯示文章標題
Label1.Text = myreader("title")
'顯示文章屬性
Label2.Text = "-----作者:" & myreader("writer") & " 文章出自:" & myreader("fw") & " 發(fā)布時間:" & myreader("sdate")
Label2.Text += " 查看次數(shù):" & myreader("views")
'顯示關(guān)鍵字
Label4.Text = "關(guān)鍵字 [" & myreader("keyword") & "]"
'顯示文章內(nèi)容
Label3.Text = myreader("content")
'動態(tài)網(wǎng)頁標題
Mytitle.InnerText = myreader("title") & "-----叮咚文章管理系統(tǒng)"
Loop
myreader.Close()
updateviews(Request.Params("aid"))
End If
End Sub
'更新文章瀏覽次數(shù)
Sub updateviews(ByVal aid As String)
mysql = "update articles set views=views+1 where id=" + aid
Dim mycmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(mysql, mycon)
mycmd.ExecuteNonQuery()
mycon.Close()
End Sub
End Class
'--code end--
Tealker.ascx的HTML代碼如下:
Tealker.ascx.vb的邏輯代碼如下:
'---code begin--
Imports System.Web.Configuration
Public Class tealker
Inherits System.Web.UI.UserControl
#Region " Web 窗體設(shè)計器生成的代碼 "
'此處省略了設(shè)計器生成的無關(guān)代碼,以節(jié)省篇幅
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此處放置初始化頁的用戶代碼
aid = Request.Params("aid")
If aid <> "" Then
getdata()
End If
End Sub
' 顯示文章評論信息
Sub getdata()
Dim constr As String = ConfigurationSettings.AppSettings("constr") & Server.MapPath(".") & ConfigurationSettings.AppSettings("dbs")
Dim mycon As OleDb.OleDbConnection = New OleDb.OleDbConnection(constr)
If Not Page.IsPostBack Then
mysql = "select * from talks where articleid=" + Request.Params("aid") + " order by tdate asc"
Dim mycmd As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(mysql, mycon)
Dim dt As DataSet = New DataSet
mycmd.Fill(dt)
Repeater1.DataSource = dt.Tables(0)
Repeater1.DataBind()
End If
End Sub
'提交文章評論內(nèi)容
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim constr As String = ConfigurationSettings.AppSettings("constr") & Server.MapPath(".") & ConfigurationSettings.AppSettings("dbs")
Dim mycon As OleDb.OleDbConnection = New OleDb.OleDbConnection(constr)
If Page.IsValid Then
mysql = "insert into talks(articleid,talker,email,content) values(" + Request.Params("aid") + ",'" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text.Replace(Chr(10), "<br>") + "')"
mycon.Open()
Dim mycmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(mysql, mycon)
mycmd.ExecuteNonQuery()
Response.Write("<script>alert('恭喜您,評論成功!');</script>")
mycon.Close()
Response.Redirect("Thearticle.aspx?aid=" & Request.Params("aid"))
getdata()
End If
End Sub
End Class
'--code end--
保存編譯后,運行結(jié)果如圖14.13、14.14所示
14.4 本章小結(jié)
這個實例功能相對簡單,結(jié)構(gòu)也很清晰,目的是對前面所學知識的總結(jié)和練習。主要是練習了服務器端控件以及數(shù)據(jù)庫技術(shù)方面的知識,希望讀者用心體會其中的用法。
為了是讀者能夠關(guān)注與文章管理系統(tǒng)本身的結(jié)構(gòu)和各個功能模塊之間的聯(lián)系,本實例在編寫的過程中省略了一些細節(jié)問題,比如頁面間傳遞參數(shù),如果在實際應用中不加驗證,就會有被攻擊的危險。但是這完全不影響作為分析學習本系統(tǒng)的目的,如果讀者要將本系統(tǒng)改造成實際應用系統(tǒng)的時候一樣要注意。
在實例系統(tǒng),我們沒有考慮到對普通用戶的管理和多管理員情況的管理,但是在實際引用中往往會提供用戶注冊,然后注冊會員會享有特別的服務。這里,我們把這個功能的實現(xiàn)作為一個作業(yè),留給讀者來思考怎么做,然后編碼實現(xiàn)它。
通過本章的學習,讀者已經(jīng)可以從整體上把握一個管理信息系統(tǒng)的設(shè)計。本章實例嚴格按照管理系統(tǒng)的設(shè)計步驟, 從分析到實施,如果讀者能從這個方面來學習這個實例,對以后編寫大型的管理系統(tǒng)很有幫助。