- PR -

フレームで表示している画面のURLを特定したい

1
投稿者投稿内容
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-05-11 17:46
お世話になっております。

当方asp.net(c#)にてwebアプリを開発しています。
質問させて下さい。
左右に分割したフレームの右フレームで現在表示しているURLをクライアント側で取得する為にはJavaScriptで
「parent.右フレーム.document.location.href」
と記述すれば取得できますが、この右フレームをcontext.server.transferで画面遷移させた後に遷移先のURLを上記方法で取得しようとしたところ、遷移前のURLが取得されてしまいました。

同じ画面遷移でもクライアント側(JavaScript)でする場合には上記方法で遷移後の画面のURLが取れるのですが、サーバー側で画面遷移させるとlocationのURLが書き換わらないということでしょうか?

やりたいことは右フレームに表示されている画面を左フレーム(クライアント)で特定したいのですが、locationからでは上記の問題でうまくいきません。良い方法があったら教えて下さい。よろしくお願いします。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-05-12 00:06
引用:

サーバー側で画面遷移させるとlocationのURLが書き換わらないということでしょうか?



ちょっと違います。
サーバー側で画面遷移させているためにURLが書き換わらないわけではありません。

Transferメソッドは、指定したページの処理を最初にリクエストしたページの内部で実行します。

プログラミングASP.NETの第16回の「図16.2 Transferメソッドの動作」をみてください。
『リクエスト』と『レスポンス』の矢印が一対しかないのがおわかりいただけると思います。

これは、ブラウザがサーバに対して1回しかリクエストを行っていないことを表します。

それに対して、「図16.1 Redirectメソッドの動作」では、矢印が二対あります。

ブラウザがサーバに対して2回リクエストを行っているということになります。
(1回目のレスポンスが302なので。)

ブラウザが表示するURLは、「リクエストしたURL(レスポンスを返したURL)」です。
Transferメソッドでブラウザが表示するURLが換わらない理由がおわかりいただけたでしょうか?


と、前置きが長くなりましたが、サーバ側遷移でブラウザに表示されるURLを換えるためには、
Redirectをする必要があります。

ただし、本質的にはTransferとRedirectは別物です。
単純にメソッドを置き換えれば良いというわけではない点にはご注意ください。


参考:鳩丸ぐろっさり 用語「302」
  :e-Words HTTPリダイレクト

[ メッセージ編集済み 編集者: He 編集日時 2004-05-12 00:10 ]
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-05-12 11:52
Heさん、詳しい解説ありがとうございました。
redirectとtransferの処理構造が良く解ってませんでした。お恥ずかしい…。
なるほどtransferでの画面遷移は遷移先画面を直接リクエストしていないからブラウザのlocationは最初にリクエストした遷移元のURLになっているのですね。

遷移方法をredirectにすればこの問題は解決しそうですが、おっしゃる通り遷移方法の変更は難しいので他の方法を考えました。
Aフレームにhiddenを配置して、Bフレームのローカルのonload処理(JavaScript)でそのhiddenにBフレームに今何が表示されているかの情報を送る事によってAフレームで現在Bフレームで表示されているaspxを特定するという方法です。
が、この方法でもBフレームを画面遷移させなければうまくいくのですが、transferで画面遷移させるとonloadのJavaScript自体が動きません(外部コンポーネントエラー)。
これもtransferで遷移させた事による現象でしょうか?

ならばとサーバー側のload処理にてAフレームにBフレームの表示情報を送ろうと思ったのですが、これってC#やる方法ってありますか?JavaScriptでなら出来るのですが…。

ご教授よろしくお願いします。以上です。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-05-13 00:43
はずしてたらすみません。

単純に、
Bフレームで表示するページに
『<input type="hidden" id="url" value="/xxx/xxx.aspx" >』
と、書いておくのでは駄目ですか?

というか、
引用:

やりたいことは右フレームに表示されている画面を左フレーム(クライアント)で特定したい


ということであれば、URLに拘らなくても画面IDなどをhiddenに持たせておけば良いのでは?
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-05-13 18:59
お世話になっております。

Bフレームで表示する各画面に同一idのhiddenを持たせてそれを手がかり(URLでもなんでも良いので)にする方法は考えたのですが、JavaScriptでAフレームからそのhiddenを参照するのには

「parent.Bフレーム.document.Bフレームで表示している画面のフォーム名.hidden名」

というように各画面のフォーム名が必要になるので不可能かな、と思ったのですが認識違いでしょうか?(そもそもそのフォーム名が特定出来ないので)

そこでAフレームにhiddenをもたせてBフレームから書き込む方法を考えたのですが、前述の問題でうまくいきませんでした…。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-05-14 00:48
思いつくままに幾つか挙げてみます。

1. ASPXであれば、おそらくドキュメント内のフォーム要素は1つしかないと思うので...
   parent.Bフレーム.document.forms[0].hidden名.value

2. hiddenなINPUT要素がFORM内になければならないわけではないので...
   parent.Bフレーム.document.getElementById("hidden名").value

3. そもそも、hiddenにしなくても、<body id="xxx">としておけば...
   parent.Bフレーム.document.body.id

対応するブラウザのバージョン等々、考慮することはあると思いますが、
私の個人的な好みで言えば、3がおすすめです。

以上、ご参考になれば。
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-05-14 16:29
Heさん、お世話になっております。

引用:

3. そもそも、hiddenにしなくても、<body id="xxx">としておけば...
   parent.Bフレーム.document.body.id



3の方法でbodyタグにidを付加したところ、無事Bフレームの画面が特定できました!
その他別フレームのhiddenを参照するやり方も色々あるんですね。勉強不足でした。
丁寧に教えて頂きありがとうございました!
1

スキルアップ/キャリアアップ(JOB@IT)