2012-01-25 66 views
2

我有一個簡單的ListView由DataPager分頁給出產品列表。當我們點擊產品時,我們打開產品詳情頁面。在詳細信息頁面上,我們希望「返回產品列表」,但當然我們希望它記住數據手冊所在的頁面。回到頁面ListView/DataPager時記得分頁

當然,這被認爲是一個自然的設計要求 - 什麼是簡單的現成的方式來做到這一點?

如果我們使用DataPager的QueryStringField屬性,我們可以在URL中獲得頁碼,所以我希望我可以在後面的鏈接中使用引用URL,但是我發現Request.UrlReferrer是不可靠的(當我使用F5例如在Internet Explorer中調試應用程序,Request.UrlReferrer始終爲空)。

我已經發現了一些成功與存儲在會話變量中的頁面數:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      if (Session["PagerIndex"] != null) 
      { 
       DataPager1.SetPageProperties((int)Session["PagerIndex"], 
        DataPager1.MaximumRows, false); 
      } 
     } 
    } 

    protected void DataPager1_PreRender(object sender, EventArgs e) 
    { 
     if (Page.IsPostBack) 
     { 
      Session["PagerIndex"] = DataPager1.StartRowIndex; 
     } 
    } 

這種方法也有一些缺點:

  1. 只有工作,如果QueryStringField是空白的(這樣的IsPostBack可以檢測)
  2. 每個尋呼機所需的會話/ cookie變量
  3. 如何重置會話/ cookie變量的問題出現

什麼是「正確」的方式來做到這一點?

感謝

回答

1

如果你沒有任何過濾器,你可以簡單地重新計算其產品是網頁。

另一種選擇是在產品詳細信息頁面的URL中對頁面進行編碼(以及列表的可能過濾值),並使用它們爲列表生成一個URL,該URL與本質上相同原始列表。甚至像用於登錄的ReturnUrl方法。 Sharepoint與它的名單做類似的事情,但我覺得URL可能太亂了(當我說它真的很雜亂時,我不是一個人認爲整個「乾淨的URL」廢話)

另一個選項將通過URL將產品ID傳遞到列表頁面。列表頁面然後可以計算適當的頁面。這將從網址中刪除噪音

+0

我明白你的意思 - 通過URL將所需數據傳遞給詳細信息頁面,然後再返回,但似乎我必須爲每種情況定製代碼。我正在從一個環境中轉變爲每一分鐘細節的代碼,並一直期待爲我完成所有這些糟糕的任務!我想你的第一個建議是更合適的,因爲列表中的數據可能已經改變,導致重新排序等,從而使存儲的頁索引失效。 – Etherman

+0

您可以將此邏輯添加到BasePage類或其他東西,因此您不需要逐個處理它。我還爲我的答案增加了另一個選項,我覺得它在某種程度上更通用。 – Stilgar

+0

其實你最後的選擇是我如何理解你的第一個選擇。這是我決定實施它的方式 - 只有產品ID需要從詳細信息頁面傳遞。從那裏我可以確定要顯示哪個頁面,即使產品列表已被更改。 – Etherman

2

您可以嘗試我的解決方案 將您的數據手冊的QueryStringField屬性設置爲查詢字符串說的頁面。

<asp:DataPager ID="DataPager2" runat="server" PagedControlID="ListView1" 
    QueryStringField="page"> 
    .... 

注意:我將DataPager放置在ListView之外。

將LinkBut​​ton的你的列表視圖,將您重定向到detailspage並在其click事件保存當前頁面數在會話

int integ; 
    decimal fract; 
    integ = DataPager2.StartRowIndex/DataPager2.PageSize; 
    fract = (DataPager2.StartRowIndex/DataPager2.PageSize) - integ; 
    if (fract > 0) 
     page = integ; 
    else if (integ > 0) page = integ - 1; 
    Session["page"]=page; 

在詳細信息頁面檢索頁面,並傳回的查詢字符串來ListViewpage 。 如果未指定頁碼1,數據手冊會自動將您帶到該頁碼。

祝你好運!

+0

您的解決方案消除了對IsPostBack和referrer url的依賴,我認爲它消除了我對會話變量所帶來的問題 - 我們可以爲每個傳呼機使用相同的會話變量。此外,這爲我節省了查明某個產品ID位於哪個頁面上的任務(並且產品列表更改的可能性很小)。 – Etherman

+0

我使用了你和Stilgar的建議的組合:我使用了QueryStringField參數,但將頁碼傳遞到URL中的細節頁面而不是會話變量(這更方便)。我用這個來獲取頁碼:PageNo =(int)Math.Truncate((double)(DataPager1.StartRowIndex/DataPager1.PageSize))+ 1; – Etherman

+0

重要的是解決方法,如果它工作,那就是目標。謝謝 – Mubarek