2012-09-28 57 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; 
     } 
    } 
}