【发布时间】:2012-09-28 16:02:05
【问题描述】:
我即将使用这个网络应用程序,但仍然有一个明显的问题,即用户使用后退按钮后网格视图中的数据错误。这是另一个主搜索/详细信息类型页面。用户搜索项目,这些项目显示在页面 search.aspx 上的网格视图中。用户可以单击项目进入详细信息页面 itemdetails.aspx。一切正常,直到用户使用后退按钮。
例如,搜索狗,在 search.aspx 上的 gridview 中获取狗列表。单击狗记录并在 itemdetails.aspx 上查看它们的详细信息。搜索猫,在 search.aspx 中的 gridview 上获取猫的列表。单击猫查看详细信息,使用返回返回到包含猫列表的 search.aspx,单击另一只猫查看详细信息。到目前为止一切都很好。当用户返回几次时,问题就开始了,从猫的详细信息到猫的搜索结果,再回到狗的详细信息,然后再回到狗的搜索结果。现在,如果用户单击搜索结果第 3 行中的狗,则显示的详细信息页面是最近搜索中第 3 行中的猫。
我已经尝试清除缓存,这会强制重新加载网格,但用户总是看到页面过期页面并且必须重新提交数据。我已经尝试过 Server.Transfer 和 Response.Redirect 到搜索页面以尝试重新加载网格,但这使得用户必须单击记录两次(一次重新加载过期的网格,然后再次转到详细信息。)还尝试了重新绑定网格,以及 4-5 天左右的许多其他事情,我不记得全部了。没有任何东西可以解决问题而不产生意想不到的副作用。在这一点上,我只想要一个解决方案,即使我必须重写整个事情。感谢您的任何建议!
公共部分类搜索: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);
}
}
【问题讨论】:
-
如何在页面之间存储数据?您是否在 URL 中使用 cookie 或编码搜索参数?我建议使用 URL,因为 cookie 可能会过期或被覆盖。
-
搜索条件存储在全局变量中。搜索词被放入全局变量 Global.Searchdata。在 search.aspx 的页面加载中,变量被检索并作为参数传递给最终填充网格的 sql 语句。与 itemdetail 标准类似。当单击项目的链接按钮时,控件的命令参数被放入全局变量 ISBNData。 ItemDetail.aspx 检索值并显示该记录。