2012-09-28 60 views
1

我即将接近这个网络应用程序,但仍然有一个明显的问题,这是用户使用后退按钮后gridviews中的错误数据。这是另一个mastersearch/detail类型页面。用户搜索项目,这些项目显示在search.aspx页面的gridview中。用户可以单击项目以转到详细信息页面itemdetails.aspx。所有工作正常,直到用户使用后退按钮。更多后退按钮和gridview问题

例如,搜索狗,在search.aspx的gridview中获取狗列表。点击狗记录并在itemdetails.aspx上查看他们的详细信息。搜索猫,在search.aspx中获取gridview上的猫列表。点击猫查看详细信息,使用返回到猫的列表search.aspx,点击另一只猫查看详细信息。到目前为止,一切都很好。问题始于用户返回几次,从猫的详细信息到猫搜索结果,回到狗的详细信息,然后回到狗的搜索结果。现在,如果用户在搜索结果第3行中单击狗,则显示的详细信息页面是最近一次搜索中来自第3行的猫。

我试过清除缓存,这迫使网格重新加载,但用户总是看到页面过期页面,并且必须重新提交数据。我尝试了Server.Transfer和Response.Redirect到搜索页面来尝试重新加载网格,但是这使得用户必须两次单击记录(一次重新加载过期的网格,然后再次去详细信息。)还尝试重新绑定网格,以及4-5天左右的其他许多事情,我不记得它们全部。没有任何东西可以解决问题而不会产生意想不到的副作用在这一点上,我只想要一个解决方案,即使我必须重写整个事情。感谢您的任何建议!

公共部分类搜索:System.Web.UI.Page { 公共字符串搜索字符串; //在搜索框中 公共字符串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

你如何在页面之间存储数据?您是否在URL中使用Cookie或编码搜索参数?由于Cookie可能会过期或被覆盖,因此我建议使用网址。 –

+0

搜索条件存储在全局变量中。搜索词被放入一个全局变量Global.Searchdata。在search.aspx的页面加载中,变量被检索并作为参数传递给最终填充网格的sql语句。与itemdetail标准类似。当点击该项目的链接按钮时,该控件的命令参数被放入全局变量ISBNData中。 ItemDetail.aspx检索该值并显示该记录。 – user1706348

回答

0

答案在我面前一直是正确的,只需要把2和2放在一起。

我将page_load中的语句移动到了保护覆盖void OnInit(EventArgs e),它清除了一切。

我通过5级搜索测试,然后使用后退按钮返回原始搜索。点击原始网格视图中的项目(或之间的任何位置)会转到正确的细节记录。感谢堆栈溢出的所有信息和提示,这个问题已解决!

0

从危险的建议,我想出了一个更可靠的解决方案。 很明显,事情发生了很大的变化,因为我在07年考上了asp.net大学 (想象一下!) 无论如何,我发现如果你使用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\[email protected]]", ""); 
     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; 
     } 
    } 
}