• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マスターページの値の渡し方について。)

マスターページの値の渡し方について

このQ&Aのポイント
  • マスターページの値の渡し方について質問です。Visual Web Developer 2008を使用していて、マスターページにツリービューがあり、それをクリックするとデータ表示ページに遷移し、展開されたノードの状態を維持したいです。しかし、クエリ文字列での情報の受け渡しではポストバックが起きず、ノードの状態が初期化されてしまいます。
  • 解決案として、以下の方法を考えています。1:マスターページに隠しテキストボックスを配置し、その値をデータ表示ページで取得する。2:グローバル変数を使用する。3:Friend Sharedを使用する。
  • ただし、具体的な使用方法やグローバル変数の宣言場所については知識が不足しており、Friend Sharedの使用方法もよくわかっていません。最終的には隠しテキストボックスを使用する予定ですが、可能な限り変数として値を渡す方法を探しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Xaval
  • ベストアンサー率58% (61/105)
回答No.1

設計手法ですね。 とりあえずポストバックは前提。どうやってデータを引き渡すか、です。 少々難しいステップに来ていると思うので、単純な方法論じゃなく、志向も説明します。解らない言葉は調べてください。アプリケーションスペシャリストとして必要です。 1)マスターページに隠しテキストボックス  いかなる場合でも値保持のための「隠しコントロール」はおやめください。後述するFormを使用してください。 2)グローバル変数 .NET自体にグローバル変数はありますが、C#.NETやVB.NETではサポートされません。ですが、共通に参照する「メディエータ」は利用できます。後述します。 3)Friend Sharedを使う 静的変数は、アプリケーションデータスロットの変数です。アプリケーションドメイン内で共通になります。スレッドデータスロットの変数を利用する必要があります。(1アプリケーションドメイン内に複数人のアクセスがあるので、この設計は注意してください)。 staticは排他制御が必要うな場合(ファイルのロックなど)に有効です。 以上の1~3の代替えとしては、Request.Formを利用してください。 RequestインスタンスはPageあるいはHttpContextインスタンスのプロパティとして取得できます。 スレッドデータスロットなので、ポストしてからブラウザにデータが帰るまでの間のデータスロットです。次のポストバックにはまた別になります。 Request.Forms("Data1") = DropDownList1.SelectedValue string value = Request.Forms("Data1") データの代入が、ボタンクリックイベントで行われる場合、それより後のイベントでしかデータ取り出しはできません。うっかりaspxのLoadイベントで取るととれません。PreRenderイベントなどを利用してください。 ------------------- ここからは、オブジェクト指向プログラマとして重要です。 一応言っておきますが、マスターページの中にページがあるように見えますが、実際には逆です。 なので、マスターページで共通機能を持たせる場合、ポストバックはaspxページを意識しない作りになってしまうはずです。 では、どうするか・・・ A)先のグローバル変数のように、何らかの「メディエーター」を使う方法があります。マスターページクラス内に、適当な変数を作成し、ページクラスはそこにデータがあれば、そのデータをもとに処理をする、なければ何もしない、という方法です。マスターページはどのaspxページから参照されるか知る必要はありません。ただ、メディエーターに値を放ります。 aspxページは、マスターページが何をしたか知る必要はありません。Page.MasterPage(キャストしてね).SomeDataBox とかに、検索条件値の値があるかどうかだけをみます。 この方法は、新しいaspxページの追加時に、マスターページを変更しないので拡張性に富みます。 B)参照情報と逆方向のデータの流れなので、「オブザーバー実装パターン」をまず最初に思い浮かべます。 サーチページにインターフェースを持たせ、それをトリガーにする方法です。 ページクラスにISearchPageインターフェースを継承。 ISearchPage インターフェースのメンバーは、 void Search(object data) です。VBなら値を返さないSubです。 マスターページで、自分を参照するページはPageプロパティで取得できますので、そのインスタンスがISearchPageにキャスト可能(これVBだと難しい?)なら、キャストして実行 ((ISearchPage)this.Page).Search (this.DropDownList1.SelectedValue); aspxのページクラスには、検索実行ロジックを書いておきます。 この方法も、検索ページが増えたとしても、ISearchPageを継承していれば、マスターページクラスは変更する必要はなく、拡張性に富んでおります。 思いつく分にはこの二つが代表かと思います。

noname#241259
質問者

お礼

丁寧な回答ありがとうございます。 まだまだ勉強中で、いただいた回答の半分も理解できない状況ですが、ゆっくり自分の中で噛み砕き、今後の役に立てようと思います。 まずはRequest.Formですね。 もう回答つかないんじゃ・・・?と思っていたので、回答くださってうれしかったです。 本当にありがとうございました!

すると、全ての回答が全文表示されます。

関連するQ&A