下面是代码:
我的愿意是“添加一个文章评论后,就马上从数据里读取前10条最新记录出来。”,当然这个刚添加的记录是在这个范围之内的。
然而添加记录后并没显示出我的新加数据,但是刷新的话就会又添加一条记录(这里暂时叫做记录2,先前叫做记录1),这时候会显出(记录1),而没有显示出(记录2)
其中 id 是对应所评论的文章id
pagesize currentpage 是分页变量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace zcms
{
public partial class Blog : System.Web.UI.Page
{
public int id;
public MODEL.BlogInfo blog;
public string url;
protected void Page_Load(object sender, EventArgs e)
{
bindBlog();
if (!IsPostBack) {
bindGuestBook();
}
}
private void bindBlog() {
id = Convert.ToInt32(Request.QueryString["id"]);
blog = BLL.Blog.GetBlogById(id);
this.Title = blog.Title;
url = Request.Url.ToString();
}
private void bindGuestBook() {
rp_guestbook.DataSource = BLL.GuestBook.GetBookOnPage(10, 1, id);
rp_guestbook.DataBind();
}
protected void AddGuestBook(object sender, EventArgs e) {
id = Convert.ToInt32(Request.QueryString["id"]);
MODEL.GuestBookInfo guestbook = new MODEL.GuestBookInfo();
guestbook.User = name.Value;
guestbook.Email = email.Value;
guestbook.Content = content.Value;
guestbook.WebSite = website.Value;
guestbook.PostTime = DateTime.Now.ToString();
guestbook.IsBest = 0;
guestbook.IsPass = 1;
guestbook.IsTop = 0;
guestbook.Replay = id;
BLL.GuestBook.AddGuestBook(guestbook);
bindGuestBook();
}
}
}
添加成功后,重新加载页面!记得是重新加载。
在AddGuestBook方法下面,不用加bindGuestBook();页是写上下面代码。
Response.Write("<script language=javascript>alert('您已成功留言...!');window.location.href='这个页面.aspx';</script>");
再刷新又有一条记录,这是因为再次提交Request,所以产生了两条重复的记录。此时触发if (!IsPostBack) { bindGuestBook(); }所以产生新的列表。
你可以跟踪下BLL.GuestBook.GetBookOnPage(10, 1, id);这个方法,看看获取数据集时是否有缓存。
要想获取guest列表,最有效的方法是再次刷新页面,或跳转到原页面。
如果不想整个页面刷新。可以用ajax局部刷新页面
ASP.NET在你点击按钮后如果再刷新则会重复提交。
再新增完数据后调用方法bindGuestBook();逻辑没错。
如果想防止刷新后再次提交可以使用Resonse.Redirect()重新定向到这个页面,如果想界面友好性,可以在评论那边加个锚记“#guestbook”,Resonse.Redirect("Blog.aspx#guestbook");
添加之后再刷新会再添加一条新的记录,很有可能除了ID不一样,其它都一样。可以限制页面重复提交,或者重定向到这个页面。
单步是解决这个问题的最佳方法!