我即将使用这个网络应用程序,但仍然有一个明显的问题,即用户使用后退按钮后网格视图中的数据错误。这是另一个主搜索/详细信息类型页面。用户搜索项目,这些项目显示在页面 search.aspx 上的网格视图中。用户可以单击项目进入详细信息页面 itemdetails.aspx。一切正常,直到用户使用后退按钮。
例如,搜索狗,在 search.aspx 上的 gridview 中获取狗的列表。单击狗记录并在 itemdetails.aspx 上查看它们的详细信息。搜索猫,在 search.aspx 中的 gridview 上获取猫的列表。单击猫查看详细信息,使用返回返回到包含猫列表的 search.aspx,单击另一只猫查看详细信息。到目前为止一切都很好。当用户返回几次时,问题就开始了,从猫的详细信息到猫的搜索结果,再回到狗的详细信息,然后再回到狗的搜索结果。现在,如果用户单击搜索结果第 3 行中的狗,则显示的详细信息页面是最近搜索中第 3 行中的猫。
我试过清除缓存,这会强制重新加载网格,但用户总是看到页面过期页面并且必须重新提交数据。我已经尝试过 Server.Transfer 和 Response.Redirect 到搜索页面以尝试重新加载网格,但这使得用户必须单击记录两次(一次重新加载过期的网格,然后再次转到详细信息。)还尝试了重新绑定网格,以及 4-5 天左右的许多其他事情,我不记得全部了。没有任何东西可以解决问题而不产生意想不到的副作用。在这一点上,我只想要一个解决方案,即使我必须重写整个事情。感谢您的任何建议!
public partial class Search : System.Web.UI.Page { public string searchString;//用于在搜索框中输入的信息 public string searchISBN;//在gridview ISBN中保存点击的项目
private void GetProducts()
{
try
{
DataSet ds = DataAccess.GetProductsPerCategory(searchString);
GridView1.DataSource = ds;
GridView1.DataBind();
}
catch (SqlException ex)
{
lblSearch.Text = "Cannot get product data." + ex.Message;
}
}
protected void Button2_Click(object sender, EventArgs e)
//button in gridview, sends to item detail page
{
LinkButton btn = (LinkButton)(sender);
searchISBN = btn.CommandArgument;
//call product detail page, pass ISBN
Global.SetISBNData = searchISBN;
Server.Transfer("ItemDetail.aspx");
}
//when this search page is called from site.master page,
//search criteria passed to GetProducts
protected void Page_Load(object sender, EventArgs e)
{
if (IsExpired())
{
Response.Redirect("Expired.aspx");
}
else
{
this.SaveTimeStamps();
searchString = Global.GetSearchData;
GetProducts();
}
}
private bool IsExpired()
{
if (Session["Search_SearchStamp"] == null)
return false;
else if (ViewState["SearchStamp"] == null)
return false;
else if (ViewState["SearchStamp"].ToString() ==
Session["Search_SearchStamp"].ToString())
return false;
else
return true;
}
private void SaveTimeStamps()
{
DateTime dtm = DateTime.Now;
ViewState.Add("SearchStamp", dtm);
Session.Add("Search_SearchStamp", dtm);
}
}