准备工作:
1:创建数据表Shop_guestbook
2:用动软生成器生成代码。
3:在生成的DAL文件GuestbookDAO.cs中写分页方法和计算记录数的方法。(同前面的一样)
只需要把前面的代码复制过去,更改一下表名即可。
前台制作:
分为三步:
第一步:用户发表留言
第二步:管理员回复
第三步:分页
【一】用户发表留言:
1:新建一个前台页面guestbook.aspx,把静态页面代码弄进去,把静态页的控件替换为服务器端控件。
注意,RadioButton控件使用:男女控件,都添加GroupName="sex"属性,让它们为一组,从而达到互斥的目的。
2:用Repeater控件,把数据库中的数据绑定到前台页面。
<asp:Repeater ID="rep" runat="server" onitemdatabound="rep_ItemDataBound">
<ItemTemplate>
<table width="100%" border="1" class="gb_table">
<tr>
<td width="19%" style="color: red; font-weight: bold; padding: 5px;">
第<%#Eval("id") %>条
</td>
<td width="81%" style="padding: 5px;" align="right">
<img src="images/qq.gif" width="16" height="16" /><%#Eval("qq") %>
<img src="images/email.gif" width="14" height="15" /><%#Eval("email") %>
<img src="images/url.gif" width="16" height="16" /><%#Eval("url") %>
</td>
</tr>
<tr>
<td rowspan="2">
<img src="images/boy.gif" width="70" height="55" />
</td>
<td align="left" valign="top" style="padding: 5px;">
<span class="boldfont">姓名:</span><%#Eval("username") %><br /><span class="boldfont">内容:</span><br />
<%#Eval("body") %>
</td>
</tr>
<tr>
<td align="right" valign="top">
<%#Eval("createDate") %>
</td>
</tr>
<asp:Panel ID="palReplay" runat="server">
<tr>
<td colspan="2" bgcolor="#CCCCCC" style="padding: 5px;">
<span class="redfont">管理员回复:</span><br />
<asp:Literal ID="litReplay" Text='<%#Eval("replay") %>' runat="server"></asp:Literal>
</td>
</tr>
</asp:Panel>
</table>
</ItemTemplate>
</asp:Repeater>
3:cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Web
{
public partial class guestbook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
rep.DataSource = new MyShop.DAL.GuestbookDAO().GetList("");
rep.DataBind();
}
//清空
protected void btnClear_Click(object sender, EventArgs e)
{
txtbody.Text = "";
txtemail.Text = "";
txtqq.Text = "";
txturl.Text = "";
txtusername.Text = "";
}
//提交留言
protected void btnAdd_Click(object sender, EventArgs e)
{
string username = txtusername.Text;
string body = txtbody.Text;
string qq = txtqq.Text;
string url = txturl.Text;
string email = txtemail.Text;
int sex = rad0.Checked ? 0 : 1;
int res=new MyShop.DAL.GuestbookDAO().Add(new MyShop.Model.Guestbook() {
username=username,
url=url,
body=body,
email=email,
sex=sex,
qq=qq
});
rep.DataSource = new MyShop.DAL.GuestbookDAO().GetList("");
rep.DataBind();
txtbody.Text = "";
txtemail.Text = "";
txtqq.Text = "";
txturl.Text = "";
txtusername.Text = "";
if (res > 0)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('留言成功!')</script>");
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('留言失败,请联系管理员!')</script>");
}
}
}
}
但是,用户的头像无论是男孩是女,并没有发生变化,在这里要进一步完善头像随性别变化功能:
实现方法:为头像显示写一个后台方法就可以了
前台头像
aspx代码:
<img src="images/boy.gif" width="70" height="55" />
改写一下:
<img src='images/<%#GetSexImg(Eval("sex")) %>' width="70" height="55" />
在后台cs代码中,添加一个GetSexImg方法,传一个参数为Eval("sex"),注意,这个参数是Object类型的。
cs代码:
//获取性别头像
public string GetSexImg(object sex)
{
return sex.ToString() == "1" ? "boy.gif" : "girl.gif";
}
【二】管理员回复:
原理:Repeater是个循环控件,这个控件每循环显示一项,都会触发ItemDataBound事件,我们在这个事件中可以控制Panel的隐藏和显示。
1:前台页面中把管理员回复的内容放在Panel控件中,当有管理员回复的时候可以把回复显示出来,如果没有回复,则可以把回复这个Panel控件隐藏起来。
<asp:Panel ID="palReplay" runat="server">
<tr>
<td colspan="2" bgcolor="#CCCCCC" style="padding: 5px;">
<span class="redfont">管理员回复:</span><br />
这里是回复内容
</td>
</tr>
</asp:Panel>
2:回复的内容,用Literal控件显示出来,为这个控件的Text属性绑定数据
<asp:Panel ID="palReplay" runat="server">
<tr>
<td colspan="2" bgcolor="#CCCCCC" style="padding: 5px;">
<span class="redfont">管理员回复:</span><br />
<asp:Literal ID="litReplay" Text='<%#Eval("replay") %>' runat="server"></asp:Literal>
</td>
</tr>
</asp:Panel>
3:cs代码:
注意FindControl函数的应用:
//循环列表事件,循环Repeater控件里面的每一行的时候发生的事件
protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType== ListItemType.AlternatingItem||e.Item.ItemType== ListItemType.Item)//当前行的类型是否等于奇数,或者当前行的类型是否等于item列
{
Panel palReplay = e.Item.FindControl("palReplay") as Panel;//通过FindControl函数,查找出id为pnlReplay的Panel控件
Literal litReplay = e.Item.FindControl("litReplay") as Literal;
if (litReplay.Text.Trim().Length==0)//若litReplay从后台数据库中提取的文本为空,则Panel隐藏,否则,显示出来
{
palReplay.Visible = false;
}
else
{
palReplay.Visible = true;
}
}
}
【三】分页:
和第一阶段的分页一样。
最终aspx代码:
<tr>
<td height="35" align="left" valign="top" style="padding-right: 20px; border-bottom: 1px #999999 solid;">
<asp:Repeater ID="rep" runat="server" onitemdatabound="rep_ItemDataBound">
<ItemTemplate>
<table width="100%" border="1" class="gb_table">
<tr>
<td width="19%" style="color: red; font-weight: bold; padding: 5px;">
第<%#Eval("id") %>条
</td>
<td width="81%" style="padding: 5px;" align="right">
<img src="images/qq.gif" width="16" height="16" /><%#Eval("qq") %>
<img src="images/email.gif" width="14" height="15" /><%#Eval("email") %>
<img src="images/url.gif" width="16" height="16" /><%#Eval("url") %>
</td>
</tr>
<tr>
<td rowspan="2">
<img src='images/<%#GetSexImg(Eval("sex")) %>' width="70" height="55" />
</td>
<td align="left" valign="top" style="padding: 5px;">
<span class="boldfont">姓名:</span><%#Eval("username") %><br /><span class="boldfont">内容:</span><br />
<%#Eval("body") %>
</td>
</tr>
<tr>
<td align="right" valign="top">
<%#Eval("createDate") %>
</td>
</tr>
<asp:Panel ID="palReplay" runat="server">
<tr>
<td colspan="2" bgcolor="#CCCCCC" style="padding: 5px;">
<span class="redfont">管理员回复:</span><br />
<asp:Literal ID="litReplay" Text='<%#Eval("replay") %>' runat="server"></asp:Literal>
</td>
</tr>
</asp:Panel>
</table>
</ItemTemplate>
</asp:Repeater>
</td>
</tr>
<tr>
<td align="center">
<webdiyer:AspNetPager ID="anp" runat="server" FirstPageText="首页"
LastPageText="尾页" NextPageText="下一页" NumericButtonCount="5"
PrevPageText="上一页"
CustomInfoHTML="共%PageCount%页,当前为第%CurrentPageIndex%页,每页%PageSize%条"
PageSize="5" ShowCustomInfoSection="Left">
</webdiyer:AspNetPager>
</td>
</tr>
cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Web
{
public partial class guestbook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
anp.RecordCount = new MyShop.DAL.GuestbookDAO().CalcCount(GetCond());
BindRep();
}
private string GetCond()
{
string cond = "";
return cond;
}
private void BindRep()
{
rep.DataSource = new MyShop.DAL.GuestbookDAO().GetList("*","id","desc",anp.PageSize,anp.CurrentPageIndex,GetCond());
rep.DataBind();
}
//清空
protected void btnClear_Click(object sender, EventArgs e)
{
txtbody.Text = "";
txtemail.Text = "";
txtqq.Text = "";
txturl.Text = "";
txtusername.Text = "";
}
//提交留言
protected void btnAdd_Click(object sender, EventArgs e)
{
string username = txtusername.Text;
string body = txtbody.Text;
string qq = txtqq.Text;
string url = txturl.Text;
string email = txtemail.Text;
int sex = rad0.Checked ? 0 : 1;
int res=new MyShop.DAL.GuestbookDAO().Add(new MyShop.Model.Guestbook() {
username=username,
url=url,
body=body,
email=email,
sex=sex,
qq=qq
});
BindRep();
txtbody.Text = "";
txtemail.Text = "";
txtqq.Text = "";
txturl.Text = "";
txtusername.Text = "";
if (res > 0)
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('留言成功!')</script>");
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "MsgBox", "<script>alert('留言失败,请联系管理员!')</script>");
}
}
//循环列表事件,循环Repeater控件里面的每一行的时候发生的事件
protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType== ListItemType.AlternatingItem||e.Item.ItemType== ListItemType.Item)
{
Panel palReplay = e.Item.FindControl("palReplay") as Panel;
Literal litReplay = e.Item.FindControl("litReplay") as Literal;
if (litReplay.Text.Trim().Length==0)
{
palReplay.Visible = false;
}
else
{
palReplay.Visible = true;
}
}
}
//获取性别头像
public string GetSexImg(object sex)
{
return sex.ToString() == "1" ? "boy.gif" : "girl.gif";
}
}
}
后台制作:
管理页面的制作:
1:新建一个guestbook_list.aspx页面,作为列表页显示出所有用户的回复
aspx代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="guestbook_list.aspx.cs" Inherits="Web.admin.guestbook_list" %>
<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
.style1 {
width: 100%;
border-style: solid;
border-width: 1px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<h1>用户留言管理</h1>
<asp:TextBox ID="txtkey" runat="server"></asp:TextBox>
<asp:Button ID="btnSearch" runat="server" Text="查询" οnclick="btnSearch_Click" />
<br />
<table class="style1" border="1px">
<tr>
<td>
姓名</td>
<td>
留言</td>
<td>
操作</td>
</tr>
<asp:Repeater ID="replist" runat="server">
<ItemTemplate>
<tr>
<td>
<%#Eval("username") %></td>
<td>
<%#Eval("body") %></td>
<td>
<a href='guestbook_replay.aspx?id=<%#Eval("id") %>'>回复</a>
<asp:LinkButton ID="lbtnDel" OnClick="Del" CommandArgument='<%#Eval("id") %>' OnClientClick="return confirm('是否确定删除?')" runat="server">删除</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
<tr>
<td colspan="4">
<webdiyer:AspNetPager ID="anp" runat="server" CustomInfoHTML="总%PageCount%页,第%CurrentPageIndex%页/%PageCount%页" FirstPageText="首页"
LastPageText="尾页" NextPageText="下一页" NumericButtonCount="5" PageSize="5"
PrevPageText="上一页" ShowCustomInfoSection="Left" SubmitButtonText="GO" onpagechanged="anp_PageChanged">
</webdiyer:AspNetPager>
</td>
</tr>
</table>
</form>
</body>
</html>
cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Web.admin
{
public partial class guestbook_list : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
anp.RecordCount = new MyShop.DAL.GuestbookDAO().CalcCount(GetCond());
BindRep();
}
}
public string GetCond()
{
string cond = "";
if (txtkey.Text.Trim().Length != 0)
{
string key = txtkey.Text.Trim();
cond = " body like '%" + key + "%'";
}
return cond;
}
private void BindRep()
{
replist.DataSource = new MyShop.DAL.GuestbookDAO().GetList("*", "createdate", "desc", anp.PageSize, anp.CurrentPageIndex, GetCond());
replist.DataBind();
}
//删除
protected void Del(object sender, EventArgs e)
{
string id = (sender as LinkButton).CommandArgument;
new MyShop.DAL.GuestbookDAO().Delete(int.Parse(id));
BindRep();
}
//分页事件
protected void anp_PageChanged(object sender, EventArgs e)
{
BindRep();
}
//查询
protected void btnSearch_Click(object sender, EventArgs e)
{
anp.RecordCount = new MyShop.DAL.GuestbookDAO().CalcCount(GetCond());
BindRep();
}
}
}
2:管理员回复页面,建立一个guestbook_replay.aspx页面
aspx代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="guestbook_replay.aspx.cs" Inherits="Web.admin.guestbook_replay" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<h1>管理员回复</h1>
<p>姓名:<asp:Literal ID="litname" runat="server"></asp:Literal>
</p>
<p>留言<asp:Literal ID="litbody" runat="server"></asp:Literal>
</p>
<asp:TextBox ID="txtreplay" runat="server" TextMode="MultiLine" Height="141px" Width="534px"></asp:TextBox>
<br />
<asp:Button ID="btnreplay" runat="server" Text="回复" οnclick="btnreplay_Click" />
<asp:Literal ID="litmsg" runat="server"></asp:Literal>
</form>
</body>
</html>
cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Web.admin
{
public partial class guestbook_replay : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string id = Request.QueryString["id"];
int x;
if (int.TryParse(id, out x))
{
MyShop.Model.Guestbook model = new MyShop.DAL.GuestbookDAO().GetModel(x);
if (model != null)
{
litname.Text = model.username;
litbody.Text = model.body;
}
}
else
{
Response.Write("传入参数错误!");
Response.End();
return;
}
}
}
protected void btnreplay_Click(object sender, EventArgs e)
{
string replay = txtreplay.Text;
if (replay.Length == 0)
{
litmsg.Text = "<span style='color:red'>回复内容不能为空!</span>";
return;
}
string id = Request.QueryString["id"];
int x;
if (!int.TryParse(id, out x))
{
Response.Write("传入参数错误!");
Response.End();
return;
}
MyShop.Model.Guestbook model = new MyShop.DAL.GuestbookDAO().GetModel(x);
if (model!=null)
{
model.replay = replay;
new MyShop.DAL.GuestbookDAO().Update(model);
litmsg.Text = "<span style='color:red'>回复成功!</span>";
txtreplay.Text = "";
}
}
}
}