日志正文是系统中最重要的模块之一,作为博客系统为最终用户提供浏览日志内容的功能是必不可少的。通常一次仅能浏览一条日志,这里我们仍然使用Repeater控件来显示其内容,如图1-8所示即为布局后的日志正文。
图1-8 布局日志正文
与日志列表类似,这里也需要一个参数来指定浏览日志的编号,ShowLog.aspx.cs文件中的页面载入代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request["id"]!= null) {
dbconfig dbconn = new dbconfig();
String sql = "SELECT * FROM info where id="+Request["id"];
repLog.DataSource = dbconn.CreateSource(sql);
repLog.DataBind();
//更新阅读次数
dbconn.ExecuteNonQuery("update info set hits=hits+1 where id=" + Request["id"]);
dbconn.Clear();
}
}
}
代码中Request["id"]获取的是欲浏览日志的编号,在下面的代码看出repLog为图1-8所示布局Repeater控件的ID,最后更新了该日志的阅读次数并关闭连接。这些数据来自info表,运行效果如图1-9所示。
图1-9 浏览日志正文
日志正文模块中除应该提供浏览内容之外,还应该为用户提供发表看法和意见入口,也样也体现了博客的互动性。评论模块的实现方法有很多,难易程序也不相同,有的需要注册才能发表,有的同时还需要验证码,还有一些则都不需要。
这里为演示的方便,以简单为例,需要提供发表评论的署名和评论内容,主页作为可选的。在验证用户是否提供了这两个必备项时,使用的ASP.NET中提供的验证控件,当然也可以使用其他方法。
ASP.NET服务器端验证控件可以在客户端直接验证用户输入,并显示出错消息。这些控件在正常情况下是不可见的,只有在用户输入数据错误时,它们才是可见的。服务器端验证控件主要包含六种:CompareValidator控件、CustomValidator控件、RangValidator控件、RegularExpressionValidator控件、RequireFieldValidator控件和ValidationSummary控件。下面对他们分别进行了简单描述:
l RequireFieldValidator控件被称为非空验证控件,常用于文本输入框的非空验证。
l CompareValidator控件为比较验证控件,主要用来比较两个TextBox控件的内容或者某个控件与某个固定表达式值是否相等。
l RangValidator控件为范围验证控件,如果用户输入不在验证范围内时将引发页面错误。
l RegluarExpressionValidator控件的又称为正则表达式验证控件,该控件用于确定输入控件的值是否与某个正则表达式所定义模式匹配。
l ValidatorSummary控件又称为错误总结控件,用于显示控件的所有错误列表。
l CustomValidator控件又称为自定义验证控件,该控件允许用户根据程序设计需要自定义控件的验证方法。
在验证评论模块时,只需要使用RequireFieldValidator控件,使用该控件的一般语法形式为:
<asp:RequiredFieldValidator ID="MyRFV"
runat="server" ErrorMessage="出错信息" ControlToValidate="需要验证的控件"
Display="Static|Dymatic|None">
</asp:RequiredFieldValidator>
代码中ControlToValidate属性值为被验证控件的ID。RequireFieldValidator控件使用非常简单,如图1-10所示为评论页面的布局。
图1-10 布局评论页面
从图1-10右侧的【属性】窗格中可以看到,这个验证控件用来检测postAuthor(署名)是否为空,提示信息为“*必填项”,另一个验证控件是用来检测评论内容是否为空。
单击“提交”按钮后,将会将这些信息添加到comment表中。btnSumbit_Click方法是它的实现代码如下:
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (Request["id"] != null)
{
string Author, Contnet, IP, URL;
Author = postAuthor.Value;
Contnet = postMemo.Value;
URL = url.Value;
IP = Request.UserHostAddress;
dbconfig dbconn = new dbconfig();
string strsql = "insert into comment(author,content,ip,date,url,sortid) values(";
strsql += "'" + Author + "','" + Contnet + "','" + IP + "',";
strsql += "'" + DateTime.Now.ToString() + "','" + URL + "'," + Request["id"]+")";
dbconn.ExecuteNonQuery(strsql);
dbconn.ExecuteNonQuery("update info set replyCount=replyCount+1 where id=" + Request["id"]);
dbconn.Clear();
Response.Write("<script>alert('添加成功');window.location.href='Default.aspx';</script>");
}
}
在单击代码中第一次调用了数据库通用类中的ExecuteNonQuery()方法,它的参数为查询语句,由于方法没有返回值,通常在执行插入、更新和删除语句时使用。这里调用了两次这个方法,第一次为向commnet表中插入评论数据,第二次是更新info表中日志的评论数量。最后一行代码在数据库操作完成后,弹出对话框提示“添加成功”并转向首页,如图1-11所示。
图1-11 添加评论