2011-07-22 18 views
1

我需要幫助,因爲我沒有找到我正在使用MVVM的項目的解決方案。 一方面,我有一個Default.aspx,它包含一個具有兩個用戶控件的UpdatePanel。第一個控件是一個帶有一些要過濾的字段的FilterControl。 第二個控件是一個GridView,當我按下FilterControl中的按鈕搜索時,它允許從數據庫分頁和填充數據。假設查詢返回100條記錄。因此,如果我將PageSize設置爲20個結果,那麼我的GridView中有5個頁面正常?返回列表上一頁下一頁.NET中的控件問題

另一方面,我有一個FormView的詳細信息頁面,從GridView中接收一個項目的Id參數,並顯示有關它的信息。就在asp:FormView代碼的上面,我有另一個用戶控件,它通過相應的ViewModel從Session變量中的GridView中獲取數據,並計算哪些項目應該是下一個和上一個,因此我有一個「Back to List」鏈接和「上一個「和」下一個「鏈接。上一個和下一個鏈接正確加載。它們是帶有OnClick事件的LinkBut​​ton,它使Response.Redirect(PrevLink);例如,其中PrevLink是頁面重定向的鏈接〜/ details.aspx?Id = 5)。

我在整個eventHandler和HistoryEventArgs中異步控制導航,所以當我按下瀏覽器的後退按鈕時,一切都很好,我在default.aspx頁面中獲得了期望的結果。無論何時在默認頁面觸發回發,例如在更改gridview的頁面索引或在過濾器中執行新查詢時,我都會調用ScriptManager的AddHistoryPoint並保存多個鍵和值(篩選字段,頁數,等等)。

問題出在我按下Back to List LinkBut​​ton時。我希望數據與進入詳細信息頁面之前的數據相同。我在這個按鈕的OnClick事件中有Response.Redirect(「〜/ default.aspx」)。

你對如何管理這個有什麼想法嗎?

非常感謝!從這裏的答案


複製的代碼謝謝你的答案。 @Guvante我不想在客戶端放置「返回列表」,因爲當我編輯詳細信息頁面時,導航控件的visible屬性設置爲false。我想我沒有正確表達自己。但是我沒有在aspx頁面的OnClick事件中使用Response.Redirect。我在頁面的源代碼中有OnClick = lkbBackToList_Navigate。

我有它在以這種方式代碼隱藏:

protected void lkbNext_Navigate(object sender, EventArgs e) 
{ 
    Response.Redirect(NavigationViewModel.NextUrl); 
} 

protected void lkbPrevious_Navigate(object sender, EventArgs e) 
{ 
    Response.Redirect(NavigationViewModel.PreviousUrl); 
} 

protected void lkbBackToList_Navigate(object sender, EventArgs e) 
{ 
    Response.Redirect(NavigationViewModel.BackToListUrl); 
} 
@msarchet this is some of my code in default.aspx code behind. When I do postback I save the state of the filters, pageindex and so on in session 

public event EventHandler<HistoryEventArgs> CaptureClientBrowsing; 

protected void Page_OnInit(EventArgs e) 
{ 
    this.CaptureClientBrowsing += new EventHandler<HistoryEventArgs>(CaptureClientBrowsing_Event); 
} 

protected override void SaveDataInSession() 
{ 
    SaveInSession("FilterViewModel", this.FilteringControl.ViewModel); 
    SaveInSession("PageIndex", this.CurrentPageIndex); //CurrentPageIndex is a property with the page index of the gridview 
} 

protected void CaptureClientBrowsing_Event(object sender, HistoryEventArgs e) 
{ LoadDataFromSession(e.State); //e.State is a NameValueCollection with the values stored in session for example FilterViewModel has the user control FilteringControl and "PageIndex" has the page index of the gridview ControlsDataBinding(); 
} 

的SaveInSession方法只是保持會話[鍵] =對象,其中鍵是一個字符串,因爲它遵循:

string key = string.Format("{0}.{1}.{2}", this.GetType(), nameValue, index); 

一個例子關鍵的是

"ASP.customers_default_aspx.PageIndex.1"` so `Session[key]=1 

如果我在其他頁面點擊(例如頁碼6)電網訴查看關鍵變量的值將是

"ASP.customers_default_aspx.PageIndex.2"` and `Session[key]=5 

這裏是我卡住的地方。如果我從詳細信息頁面瀏覽到默認頁面,並在瀏覽器中點擊,CaptureClientBrowsing_Event火災和控件加載正確,並且過濾器的值也被加載。

我想要的是當我點擊LinkBut​​ton「返回列表」時,控件和過濾器也會被加載。如果我沒有歷史參數,如何獲得NameValueCollection?如果我點擊三下,然後點擊Bak以列出如何知道要加載的會話值?

也許有很多問題,這很難處理,但我試圖成爲最具體的我可以。

+0

你可以展示一些代碼 – msarchet

+0

@msarchet我已經把一些代碼的,也許你可以幫我 – Alvmad

回答

0

你說當用戶從listpage轉到detailpage然後點擊瀏覽器Back btn時它已經正常工作。如何觸發CaptureClientBrowsing事件?你可以發佈代碼顯示嗎?

當你點擊返回列表時,你不能重複使用相同的機制嗎?

更新: 好的,那麼當您將Response.Redirect()添加到列表頁面時,需要發送額外的狀態信息。

您可以使用任何常用技巧:傳遞querystring參數,設置cookie或設置另一個Session變量。

在列表頁面Init或Load中檢測到該信號,LINQ查詢會話密鑰以獲取maxHistoryIndex,然後使用從maxHistoryIndex派生的密鑰從Session恢復狀態。

E.g.如果他們通過點擊已經末頁分頁後detailpage 3倍,maxHistoryIndex = 3,你可以恢復Session[String.Format("ASP.customers_default_aspx.PageIndex.{0}", maxHistoryIndex)]

+0

CaputreClientBrowsing事件被觸發,因爲我有這樣的EventHandler:公共事件EventHandler CaptureClientBrowsing;並且在頁面的Page_Init中,我有CaptureClientBrowsing + = new EventHandler (CaptureClientBrowsing_Event); CaptureClientBrowsing_Event在歷史瀏覽器回調完成時觸發。我無法重複使用該機制,因爲當我單擊返回列表時,用戶在整個Response.Redirect(NavigationViewModel.BackToListUrl)中轉到Default.aspx,您怎麼看?謝謝 :) – Alvmad

0

我在此按鈕的OnClick事件中有Response.Redirect(「〜/ default.aspx」)。

問題是這樣做會導致列表頁面被加載,就像它是新的一樣。我會建議您跟蹤遠離列表的頁面數量,並通過將onclick客戶端設置爲history.go(-pages)來回到該頁面。

+0

感謝試圖幫助我@Guvante。我把一些代碼更清晰 – Alvmad

+0

@Alvmad:在這種情況下,你的會話對象是不是仍然填充了各種值?你能設置一個會話變量,你檢查Default.aspx何時加載重用這些歷史元素? – Guvante

+0

是的,我終於存儲在一個單獨的會話對象的過濾器的值,工作!感謝:) – Alvmad