1

Page.PreviousPage.aspx ページからのクロスページ PostBack に続いて、ジェネリック .ashx ハンドラー内で同等のものを取得することは可能ですか?

PostBack を実行する Page からいくつかの 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.PreviousPagenull であることがわかります。

この情報を取得して としてキャストする方法はありPageますか?

4

1 に答える 1

3

ここPreviousHandlerでは役に立ちません。HttpHandler がクロスページ PostBack を受け取るようにするには、この基本的な仕組みを理解する必要があります。

参照:ユーザーを別のページにリダイレクトする

クロスページ投稿は、転送がユーザー アクションによって開始されるという点で、ハイパーリンクに似ています。ただし、クロスページ ポスティングでは、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

オブジェクトを使用して現在のリクエストを処理すると、Controls コレクションに入力データが入力されていることがわかります。公開されたプロパティを使用しFindControlたり、必要なコントロールを見つけてそこから入力をフェッチしたりできるようになりました。

于 2013-04-08T12:48:02.053 に答える