我已接近使用此网络应用程序,但仍然有一个明显的问题,这是用户使用后退按钮后gridview中的错误数据。这是另一个mastersearch / detail类型页面。用户搜索项目,在search.aspx页面的gridview中显示。用户可以单击项目转到详细信息页面itemdetails.aspx。一切正常,直到用户使用后退按钮。
示例,搜索dog,在search.aspx上获取gridview中的狗列表。单击狗记录并在itemdetails.aspx上查看其详细信息。搜索猫,在search.aspx中获取gridview上的猫列表。单击猫查看详细信息,使用返回到带有猫列表的search.aspx,单击另一只猫查看详细信息。到目前为止一切都很好。当用户返回几次时,问题就开始了,从猫的详细信息到猫搜索结果,回到狗的细节,然后回到狗的搜索结果。现在,如果用户在搜索结果第3行中单击了狗,则显示的详细信息页面是最近搜索中第3行中的cat。
我已尝试清除缓存,这会强制网格重新加载,但用户始终会看到页面已过期的页面,并且必须重新提交数据。我已经尝试将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);
}
}
答案 0 :(得分:0)
答案一直在我面前,只需要将2和2放在一起。
我将page_load中的语句移动到受保护的覆盖void OnInit(EventArgs e)并且它已经清除了。
我测试了5个级别的搜索,然后使用后退按钮返回到原始搜索。单击原始gridview中的项目(或其间的任何位置)将转到正确的详细记录。感谢堆栈溢出的所有信息和提示,这个解决了!
答案 1 :(得分:0)
根据Danger的建议,我提出了一个更可靠的解决方案。 显然,自从我在大学学习asp.net以来,情况发生了很大变化 回到07年(想象一下!) 无论如何,我发现如果你使用url参数,事情会好得多 在这种情况下。正确的事件序列会引起故障 在On Init中使用全局变量和语句时。 现在使用参数化的URL,在使用后退按钮时,显然网格总是刷新。从我的Murach的书中 - 使用编码超链接的页面总是被处理,就像它一样 被要求第一次。更新了以下代码。这是一个额外的好处 方法允许直接链接到我的产品或搜索结果集。
//masterpage search button click
protected void btnMasterSearch_Click(object sender, EventArgs e)
{
//input is from the user's entry in text box
string input = txtMasterSearch.Text;
//result is filtered by regex then added to url for search
string result = Regex.Replace(input, @"[^\w\.@-]", "");
try
{
if (String.IsNullOrEmpty(result))
{
throw new ArgumentException("Null is not allowed");
}
else
{
Response.Redirect("Search.aspx?search=" + result);
}
//search.aspx
public partial class Search : System.Web.UI.Page
{
public string productparam;//product parameter to add to url
public string searchparam;//search parameter from url
protected void Page_Load(object sender, EventArgs e)
{
searchparam = Request.QueryString["search"];
GetProducts();
}
private void GetProducts()
{
try
{
DataSet ds = DataAccess.GetProductsPerCategory(searchparam);
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);
productparam = btn.CommandArgument;
Server.Transfer("ItemDetail.aspx?product=" + productparam);
}
//item detail page
public partial class ItemDetail : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
lblISBN.Text = Request.QueryString["product"];
}
catch (Exception ex)
{
lblISBN.Text = "Cannot get product data." + ex.Message;
}
}
}