ほとんどのページに表示される内部Webアプリケーション用の検索フォームを作成しようとしています。私は検索フォームをascxユーザコントロール(SearchPanel.ascx)に置き、PostBackUrl = "Default.aspx"で検索ボタンを設定しました。また、ユーザーコントロール上に公開イベントハンドラを作成しました。このボタンは、Searchボタンがクリックされたときに起動します(Default.aspxから直接開始される検索を処理できるようにします)。クロスページポストバック:PreviousPage内からResponse.Redirect()が呼び出されないようにする
Default.aspxは、SearchPanel.ascxのイベントハンドラを介してDefault.aspxが正常に動作しています。ユーザーコントロールをホストしている別のページから検索しようとすると、ブラウザはDefault.aspxにポストしますが、this.PreviousPageはnullです。したがって、私はIsCrossPagePostBackをチェックすることはできませんし、PreviousPage.FindControl( "Search")を使用して検索フォーム(テキストと2つのチェックボックス)のパブリックプロパティにアクセスすることはできません。
ユーザーコントロールから開始されたページ間のポストバックを処理するために何か他に必要なことはありますか?
更新:
私がPage_Loadの中にデバッガを破ると、Request.Formコレクションを調べると、私は暗号化されているように見える__PREVIOUSPAGE値と共に、元のページから渡されるフォームの値を見ることができます/ ViewStateのようにエンコードされます。
Page_Loadをデバッガでステップ実行すると、結果はむしろ変です。 PreviousPage!= nullかどうかを調べる行にステップインした場合、リクエストが来たページをインスタンス化することができます。完了したら、Default.aspxのPage_Loadの先頭に戻り、再度実行します。今回は、PreviousPageは単にnullです。
私は何か愚かなことをする必要がありますが、それまでは私はそれが何であるか分かりません。
プロットが厚く:
さてを、ユーザーコントロールの詳細は、赤ニシンのビットであることが判明しました。 Details.aspxページは、表示する項目を示すクエリ文字列パラメータを受け入れます。そのパラメータが空白の場合、Default.aspxにリダイレクトされます。 Default.aspxはクロスページポストバックを受け取り、PreviousPageをチェックすると、Details.aspxのPage_Load()メソッドが実行されます。
ただし、クエリ文字列パラメータがDetails.aspxに返されないため、このエラーチェックコードにヒットし、Response.Redirect()エラーハンドラが実行されるようです。
私が行う必要があるのは、クロスページのポストバックでPreviousPageとしてDetails.aspxが実行されているかどうかをチェックし、通常実行するほとんどの実行をスキップすることです。その状態をどうやって確認できますか? Page.IsPostBackはそれをキャッチしていないようです。