2013-04-08 73 views
1

是否有可能在通用.ashx處理程序中檢索等效於Page.PreviousPage,跟隨從.aspx頁面開始的跨頁PostBack?上一頁.ashx處理程序

我需要從執行PostBack的頁面訪問一些POST值 - 雖然我可以簡單地使用Request.Form - 所討論的值來自WebControls,並且因此具有相當晦澀的(並非非常健壯的)名稱(例如ctl00 $ WebFormsContent $ SomeControl $ SomeOtherControl $ txtWhatever)。

我曾嘗試以下:

public void ProcessRequest(HttpContext context) 
{ 
    Page previous = context.PreviousHandler as Page; 
    if (previous != null) 
     context.Response.Redirect("http://www.google.com"); 
} 

但是,這並不工作 - 在調試時,我可以看到context.PreviousPage爲空。

有沒有辦法檢索這些信息並將其轉換爲Page

+0

也許嘗試引薦人的財產? – 2013-04-08 12:36:37

+0

@EladLachmi我可以用這種方式得到上一頁的URL;然而,這不會等同於'Page.PreviousPage',因爲沒有維護視圖狀態。 – 2013-04-08 12:42:32

+0

即使可以獲取頁面對象,我也不認爲viewstate會被維護。如果你需要該頁面的數據,那麼做一個帖子怎麼樣? – 2013-04-08 12:46:00

回答

3

PreviousHandler不會幫你在這裏。爲了讓你的HttpHandler接收一個跨頁面PostBack,你必須瞭解它的基本工作原理。

參見:Redirecting Users to Another Page

跨頁投遞類似於超鏈接,該轉移是由用戶操作啓動 。但是,在跨頁面發佈中,使用HTTP POST命令調用目標 頁面,該命令將源頁面上的 控件的值發送到目標頁面。另外,如果 源和目標頁面位於同一個Web應用程序中,則目標頁面可以訪問源頁面的公共屬性。與往常一樣,應用程序中的頁面的所有 都可以共享存儲在會話狀態或應用程序狀態中的信息。

讀取該位後會清楚,所有您查找的值實際上都會作爲POST變量發送到您的處理程序。

你可以在context.Request.Params集合中找到它們。

既然您已經從您的頁面發出請求,那麼可以在您的處理程序中說Page1.aspx;我們需要創建一個可以處理和處理這個請求的對象。這是Page1對象的一個​​實例。

string pagePath = "~/Page1.aspx";     //virtual path to your page 
Type type = BuildManager.GetCompiledType(pagePath); //find the type 

//create an object of your page 
Page myPage = (Page)Activator.CreateInstance(type); 
myPage.ProcessRequest(HttpContext.Current);   //process the request 

使用對象處理完當前請求後,您會發現控件集合已填充並填充了輸入數據。您現在可以使用公開的屬性或FindControl來查找必要的控件並從中獲取輸入。

+0

您好nunespascal - 的確,我可以通過'Request.Form'訪問我想要的值;但是,這些值都是從WebControl發佈的,因此具有通常不太明顯的POST變量名稱(ctl00 $ WebFormsContent $ ...),我寧願避免硬編碼。 – 2013-04-08 12:52:25

+0

啊,我明白你的意思了。讓我即興答覆。 – nunespascal 2013-04-08 12:53:57

+0

添加了動態創建頁面對象以處理髮布數據的步驟。現在您應該可以從中獲取任何數據,就像您使用'PreviousPage'一樣 – nunespascal 2013-04-08 13:02:59