- PR -

別ウィンドウへのデータセッション渡しについて(VB)

1
投稿者投稿内容
プリン
会議室デビュー日: 2006/09/29
投稿数: 5
投稿日時: 2006-09-29 12:49
現在、以下のような問題で困っています。回避策をご教授頂ければと思います。
ちなみに受渡しデータの内容は外に見せたくないのでRequest.QueryStringは使用せず
セッションの受け渡しを使用したいと考えています。
使用言語:VB(Visual Studio 2005にて開発)

【問題点】
 親画面のボタンクリック時に、子画面(別ウィンドウ)を開き
 子画面に親画面から引き継いだ情報を表示しようとしていますが
 親画面からの情報がとれません。
【実装方法】
 ●親画面側のコード
  [Page_Loadメソッド]
   btna.Attributes("onclick") = "javascript:return window.open('子.aspx')"
  [btnA_Clickメソッド]
   Session("ssPrm") = "abc"
※実際には、ここでセットする"abc"というデータは、コンスタントでなく
    親画面の入力値を渡しています。
 ●子画面側のコード
  [Page_Loadメソッド]
strStore = Session("ssPrm")
【調査結果現状】
 親画面で子画面を開くボタン(btnA)をクリックすると
 子画面が別ウィンドウで表示され、子画面のPage_Loadメソッドが実行され、
 その後で、親画面のbtnA_Clickメソッドが実行されます。
 これにより、セッションのデータ設定と取得の順が逆転してしまっていることが原因のようです。
 
 ★以下が実現できれば可能かと思い、これもご教授下さい。
  親画面側の[Page_Loadメソッド]内のbtna.Attributes("onclick") を削除し
  親画面側の[btnA_Clickメソッド]内で「Session("ssPrm") = "abc"」の後に
  window.openを実行しようとしましたがwindowの宣言方法がわからなく
  window.open実行行で”「window」が宣言されていません”というコンパイルエラー
  となってしまいます。
 

[ メッセージ編集済み 編集者: プリン 編集日時 2006-09-29 13:01 ]
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-09-29 13:12
親画面側の[btnA_Clickメソッド]内で「Session("ssPrm") = "abc"」の後に
子画面を開くJavaScriptをPage.RegisterClientScriptBlockメソッドで登録すればいいかと。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2006-09-29 13:18
別ウィンドウにポストバックして画面遷移
コード:
private void Page_Load(object sender, System.EventArgs e)
{
	Button1.Attributes["onclick"] 
	= "this.form.target='_blank';"
	+ "this.form.submit();"
	+ "this.form.target='';"
	+ "return false;";
}
private void Button1_Click(object sender, System.EventArgs e)
{
	Session["ssPrm"] = "abc";
	Response.Redirect("子.aspx");
}


プリン
会議室デビュー日: 2006/09/29
投稿数: 5
投稿日時: 2006-10-02 12:35
burton999さんへ
ご教授ありがとうございます。

親画面側の[Page_Loadメソッド]内のbtna.Attributes("onclick") を削除し、
親画面側の[btnA_Clickメソッド]内で「Session("ssPrm") = "abc"」の後に
以下を追記し実行しましたが、子ウィンドウは開けませんでした。

Page.RegisterClientScriptBlock("client", "<script language='JavaScript'> window.open('子画面.aspx') </script>")


確認させて下さい。
 ・Page.RegisterClientScriptBlockを入れるのは、親画面側の[btnA_Clickメソッド]でOKでしょうか。
  ※この時のPageは親画面のページを指しています。
プリン
会議室デビュー日: 2006/09/29
投稿数: 5
投稿日時: 2006-10-02 12:43
todoさんへ
返信ありがとうございます。

"return false"部を"return true"に変えて実装したところ実現できました。
 但し、子画面が前面に表示されず、親画面が前面に表示されてしまう。
(これから調べてみまーす)

この方法で子ウィンドウが複数表示された状態で
すでに表示されている特定の子ウィンドウの内容だけ再描画したい場合
親画面で特定の子ウィンドウにだけ指示を出す方法をご教授頂ければ有難いのですが。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-10-02 16:48
引用:

確認させて下さい。
 ・Page.RegisterClientScriptBlockを入れるのは、親画面側の[btnA_Clickメソッド]でOKでしょうか。
  ※この時のPageは親画面のページを指しています。



それで問題ないと思います。
少なくとも私のVS2003の環境では動作します。
VS2005でこのへんが変わったとは思えないですが。
ボタンを押した後の親画面のソースを表示して、意図した通りにスクリプトが出力されているかを確認してください。


[ メッセージ編集済み 編集者: burton999 編集日時 2006-10-02 16:49 ]
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-10-02 17:56
ASP.NET2.0では推奨されていないですね。。。

Page.RegisterClientScriptBlock メソッド (System.Web.UI)
http://msdn2.microsoft.com/ja-JP/library/system.web.ui.page.registerclientscriptblock.aspx
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-10-03 06:06
 スクリプトからウインドウを上げると、ポップアップ ブロッカーによってブロックされることがあります。

 このため、処理的には今のまま、子画面のサーバ側処理で、セッションに入ってくるまで待つ、、、というのを薦めたい。


> 但し、子画面が前面に表示されず、親画面が前面に表示されてしまう。
SmartNavigation を使っているとか。


> すでに表示されている特定の子ウィンドウの内容だけ再描画したい場合
> 親画面で特定の子ウィンドウにだけ指示を出す方法をご教授頂ければ有難いのですが。
簡単なような、難しいような。。。

ヒント:target
次のようなスクリプトを実行させてみましょう。
window.open("url1", "_blank", あと適当);
window.open("url2", "_blank", あと適当);
window.open("url3", "child", あと適当);
window.open("url4", "child", あと適当);
window.open("url5", "child1", あと適当);
window.open("url5", "child2", あと適当);

_________________
1

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