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

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

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

すごく初歩的な質問かもしれませんが、教えてください。 Visual Web Developer 2008を使用しています。 言語はVBです。 マスターページ:masterpage.master データ表示ページ:datalist.aspx(マスターページはmasterpage.master) マスターページにツリービューがあり、それをクリックすると、データベース内を検索し、該当するものをリストとして表示するのがデータ表示ページになります。 その際の処理として、どのノードがクリックされたかの情報をクエリ文字列にてデータ表示ページに送っていましたが、そうするとポストバックが起きずに、展開されたノードは初期の状態に戻ってしまいます。 抽出したデータを表示させつつも、ツリービューは選択された状態を維持させたいのです。 そこで、いろいろ考えてみたのですが、 1:マスターページに隠しテキストボックスを置き、その中に格納された値を、データ表示ページからFindControlで取得する 2:グローバル変数を使う   ただ、グローバル変数が使えるのか、また使用方法等はまだ調べていません。 3:Friend Sharedを使う   これはグローバル変数とは違うものなんですかね・・・?    いろいろ調べてみたのですが、グローバル変数は宣言する場所がどこなのかわからないという、自分でも情けない状態です。 Friend Sharedの使用方法も微妙です・・・。 隠しテキストボックスを作るやり方は簡単にテストしたらできましたが、極力変数として値を渡す方法でやりたいと思っているので、最終手段にしようと思っています。 目的はノード展開状態の維持なのですが、マスターページからデータ表示ページに値を渡すという流れはそのままでいきたいと思っています。 ポストバック時はノードの展開状態が維持されるとどこかに書いてあったので、ポストバックさせつつ値を渡すのがいいのでは、と思っています。 ご存知の方がいましたら、ヒントでもなんでもいいので教えてください。 足りない情報等は補足いたします。 よろしくお願いします。

noname#241259
noname#241259

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

  • ベストアンサー
  • 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

  • TreeViewの再表示のちらつきをなくす方法

    お世話になっております。 VB2005でWinアプリ開発中です。 テキストボックスに条件を入力し、ボタンを押下すると、 TreeViewに該当データのノードを設定し、 ノードを展開した状態で表示する処理があります。 ノードが展開表示されている状態で、ボタンを押下し 新しい情報を再表示すると、 ノードが折りたたまれて展開されたというような動きが見えてしまいます。 SuspendLayout/ResumeLayoutを入れてみたのですが、変化無しでした。 ノードが展開された状態で、パッと再表示するには、 どのようにすればよいのでしょうか? よろしくお願いします!

  • 「戻る」ボタンで値の保持

    PHPやCGIなどで同じファイルにデータをポストした後に、ブラウザの「戻る」ボタンで戻ったときに「ページの有効期限切れ」になってしまうのですが、回避する方法はないでしょうか。 元のページとフィールドに入れた値を保持することはできないでしょうか。 他のファイルからポストしない限り値の保持は難しいのでしょうか。

    • 締切済み
    • PHP
  • C#のツリービューでツリーノードとデータの関連付け

    こんにちは。 C#でツリービューの操作をしています。 すでに階層構造を持つデータがあります。これをツリービューに表示させようとしています。 TreeNode treeNodeFruits = new TreeNode("果物"); としてツリービューに追加してあげると普通に表示できますが、このままだと独自データと関連付けがされていないため、ノードをクリックした際に何もできません。 C++ではHTREEITEMのlParamにユーザーデータのポインタをセットできますが、C#ではツリーノードに関連付けできそうな項目が見当たりません。 C#ではツリーノードと独自に持つデータとの関連付けをどのようにすればよろしいのでしょうか?

  • <form> POST時の値に戻す。

    フォームへ値入力後ポストをしたときに入力項目にエラーがあった場合や バックをした場合。 valueへポストした値(例:<input text="name" value="ポストした値">) をつけて吐き出しています。 非常に手間なのでできれば、上記処理をしなくてもフォームの input値がポストされた状態にしたいと思っています。 何か方法があるのでしょうか。

    • 締切済み
    • PHP
  • 値が渡されない

    メインページ(main.php)から次のページ(get.php) に値を渡しているのですが、受け取ってくれません。 URLを変数に入れて表示させたところ、URLの受け渡しはできていました。 ※URL = http://localhost/get.php?id=333 このURLからidの値(333)を取るために $ID = $_GET['id'] をget.php内に書いたところ、$IDの値が渡ってきません。 GETをREQUESTにしても同じです。 一体何が原因なのでしょうか? 環境: PHP5.2.0 Apache2.2.3

    • ベストアンサー
    • PHP
  • フォームの値取得について

    PHP4を利用しています。 フォームからのデータ取得で 以前はフォームで利用した名前に$をつければ その値を変数として利用できたと思うのですが、 PHP4からは設定によっては出来ないと言うことなので フォームの名前と同じ名前の変数に値を入れる為 $name1=$_POST['name1']; で取得しようと思ったのですが、 フォームで利用しているテキストボックスが多いのです。 やはりひとつづづ取得する方法しかないのでしょうか? なにか良い手があったら教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 検索フォームのセッション管理について

    PHPを利用して検索フォームから入力された値を取得し、 条件にあった画面を表示しているのですがページを戻る際に警告が出て うまく戻れません。 流れ 1,フォームから値の取得 ⇒  2,送られた値を【$a】で受け取り、セッション変数に代入、条件にあったデータの表示(select * from sample where aaa like【$a】) ⇒  3,もしフォームの値が空でセッション変数に値があれば、セッション変数を【$a】に代入し条件にあったデータの表示 ⇒  4,フォームの値、セッション変数共に空ならセッション変数を削除し、他のページに飛ばす 5,新たにフォームから値が送られた場合は値を上書きする 以下が書いたコードです。 session_start(); if(isset($_POST["test"])){ $a = $_POST["test"]; $_SESSION["test"] = $a; }elseif($_POST["test"] == "" and isset($_SESSION["test"])){ $a = $_SESSION["test"]; }else{  unset( $_SESSION["test"] );  if (isset($_COOKIE["PHPSESSID"])) {   setcookie("PHPSESSID", '', time() - 1800, '/');  }  session_destroy();  header( "Location: /top.html" );  exit(); } 以下で【$a】を使いsql文を組み立て、データを表示しています。 このコードだと前のページに戻る際firefoxでは 【このページを表示するにはフォームデータを再度送信する必要があります。フォームデータを再送信すると以前実行した検索、投稿や注文などの処理が繰り返されます。】 と表示され、IEでも 【警告 : ページの有効期限切れ 要求したページは、フォームで送信された情報を使用して作成されました。このページは、もう利用できません。セキュリティ保護のため、情報は自動的には再送信されません。 情報を再送信し、この Web ページを表示するには、ツール バーの [更新] ボタンをクリックしてください。】 と表示されてしまいます 上記のコードをどのように変更すれば警告をださず行いたいことに記述したようにできるのでしょうか? ご教授ください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • JavaScriptの変数の値が消える!?

    原因不明のエラーで悩んでます。 どなたか救いの手を! 環境IE5.0SP2 JavaScriptで300個の変数を使用し、IEの入力画面の値を保持しています。 処理ボタンのタイミンングで、入力チェックで変数の値のチェックを行い、 OKの場合、テーブルに値を書き込む・・・という動作をします。 この、入力チェックの段階で変数に値が全くない場合は、エラーで中断しています。 テーブルに書き込む段階で、変数に値がない場合は、書き込みを行いません。 ◎今回のエラー。 ・入力チェックは通過したけれども、テーブルにはデータが書き込まれていませんでした。 処理はそのまま進んでいって、正常終了したけれどもデータがないという状態になりました。 インサートで失敗した場合、エラーメッセージと共に「デバッグしますか?」という例の画面 がでるはずですが、それも表示されなかったため、インサートの段階で変数から 値が消えてしまっていたのでは・・・と考えているのですが。 入力チェックの時点で入っていた値がすぐ後の、インサートの時点で消えてしまっている、 なんてことはありえるでしょうか? やはり、ただ単にコーディングミスなのかと調べまくっていますが、分かりません。 無線LANを使用しているため、途切れた・・・という可能性とかも あるのでしょうか? 分からないことばかりですみません。よろしくお願いいたします。

  • 処理中に変数の値が変わってしまう

    Webページでセッションに値を格納し処理を行っています。 クラスをserialize()しセッションに格納して同じページで利用しています。 このセッションに格納した値がFireFoxでは想定通りに動くのですが、 IE6.0だと特定の個所のみ突然値が変わってしまいます。 ページの一番最後で出力したセッションの値が、 次ページの一番最初で出力した場合値が変わっています。 ファイルにserialize()したデータを書き込んで見たのですが、 正しいデータを持っているにもかかわらず、 書き込んだデータは異常な値でした。 また、書き込んだ後に画面に値を表示しても正常に表示されました。 $aを画面に表示     → 正常 $aをファイルに書き込み → 異常 $aを画面に表示     → 正常 環境は PHP5.1.2 Apache2.0.48 RedHatLinux9 です。 宜しくお願いします。

    • 締切済み
    • PHP
  • 2分木

    実行すると 「トップノードの値を入力してください。20 ノード[20:深さ0]の左の子の値を入れてください。15 ノード[20:深さ0]の右の子の値を入れてください。40 ノード[15:深さ1]の左の子の値を入れてください。11 ノード[15:深さ1]の右の子の値を入れてください。18 ノード[11:深さ2]の左の子の値を入れてください。/ ノード[18:深さ2]の左の子の値を入れてください。17 ノード[18:深さ2]の右の子の値を入れてください。/           ・ が表示されて2分木のデータを作成するプログラムを作りたいのです。絵で表すと、       20 / \     15 40 / \ /\ 11 18 30 55 / /\ \ 17 25 33 61 のようになります(なんか絵がずれて表示される)。 一応、自分で考えてみたのですが #include<stdio.h> #include<malloc.h> struct data { int kazu; struct data *left; struct data *right; }; main() { struct data *root,*p; root=(struct data *)malloc(sizeof(struct data)); printf("トップノードの値を入れてください:"); scanf("%d",root->kazu); root->left=root->right=NULL; while(1){ p=(struct data *)malloc(sizeof(struct data)); printf("ノード%d,深さ%dの左の子の値を入れてください",root->kazu, scanf("%d", ); printf("ノード%d,深さ%dの右の子の値を入れてください",root->kazu, scanf("%d", ); if( break; なんか全然良くわからないのです。アルゴリズムの本を見て勉強していて、データ構造は理解できたのですが、2分木(グラフ)で詰まってしまいました。 小さい順に数を表示させるとか、そういうのじゃなくて、単にデータを格納するだけです。どうかよろしくお願いします。

専門家に質問してみよう