2012-01-12 45 views
1

我試圖爲內部Web應用程序創建一個搜索表單,該表單將出現在大多數頁面上。我把搜索表單放到一個ascx用戶控件(SearchPanel.ascx)中,並用PostBackUrl =「Default.aspx」配置搜索按鈕。我還在用戶控件上創建了一個公共事件處理程序,當點擊搜索按鈕時觸發(這樣我就可以處理直接從Default.aspx啓動的搜索)。跨頁面回發:阻止從PreviousPage中調用Response.Redirect()

在查看Default.aspx時通過SearchPanel.ascx中的事件處理程序正常工作。當我嘗試從承載用戶控件的其他頁面進行搜索時,瀏覽器會發布到Default.aspx,但是this.PreviousPage爲空。因此,我無法檢查IsCrossPagePostBack,也無法使用PreviousPage.FindControl(「搜索」)來訪問搜索表單(文本和幾個複選框)的公共屬性。

爲了處理從用戶控件發起的跨頁面回發,我還需要做些什麼嗎?

更新:

如果我打破在Page_Load期間的調試和檢查Request.Form集合,我可以看到從原來的頁面傳遞的表單值,用這似乎是加密的__PREVIOUSPAGE值一起/編碼像ViewState。

當我用調試器瀏覽Page_Load時,結果很奇怪。如果我介入檢查PreviousPage!= null的行,我可以看到它實例化請求來自的頁面。一旦完成,它將返回到Default.aspx中Page_Load的開頭,並再次運行它。這一次,PreviousPage簡直是空的。

我一定在做一些愚蠢的事情,但到目前爲止我不知道它是什麼。

情節變得:

好,用戶控制細節原來是有點紅鯡魚。 Details.aspx頁面接受查詢字符串參數,指示顯示哪個項目。如果該參數爲空,則重定向回Default.aspx。看起來發生了什麼是Default.aspx接收到跨頁面回發,並且在它檢查PreviousPage時,運行Details.aspx的Page_Load()方法。

但是,它看起來像查詢字符串參數沒有發回到Details.aspx,所以它碰到這個錯誤檢查代碼並運行Response.Redirect()錯誤處理程序。

看來我需要做的是讓Details.aspx檢查它是否作爲PreviousPage在跨頁面回傳中執行,並跳過它通常執行的大部分執行。我如何檢查這種情況? Page.IsPostBack似乎沒有捕捉到它。

回答

0

那麼,事實證明,我只需要檢查Details.aspx的Page_Load()內的Page.IsCrossPagePostBack,然後如果它是真的,就跳過一堆初始化。

然後,當PreviousPage碰巧是嵌套在2或3層主頁面中的內容頁面時,嘗試使用Page.PreviousPage.FindControl()...很明顯,我剛剛解決了在HttpContext中進行混洗的問題.Current.Items。