- PR -

Javascriptでのボタンclickによる非同期ポストバック時のUpdatePanel更新

1
投稿者投稿内容
ned
会議室デビュー日: 2004/12/06
投稿数: 4
投稿日時: 2009-01-26 23:49
お世話になります。

VS2005 Webアプリにて

showModalDialogで開いた子画面と親画面のパラメータの受け渡しを
Session変数にて行っています。

親画面の「子画面表示」ボタンの処理
・Session変数Xへ値を格納
・RegisterStartupScriptに以下のjavascriptを登録
  子画面を開くshowModalDialog()
  子画面が閉じられた後に、親画面の「子画面の値取得」ボタンをclick()する処理

親画面の「子画面の値取得」ボタンの処理
・Session変数Xから値を取り出し、画面(親)へ表示

子画面の「閉じる」ボタンのクリックで
・Session変数Xへ値を格納
・RegisterStartupScriptに子画面を閉じるwindow.closeを登録



親画面の「子画面の値取得」ボタンを
通常のポストバックで処理した場合は問題無く動作するのですが
UpdatePanel内に配置し非同期のポストバックで処理を行った場合に
「子画面の値取得」ボタンの処理が画面に反映されません。
「子画面の値取得」ボタンのサーバサイドの処理は正しく行われているようですが、
UpdaatePanelが更新されていないようです。

この問題の回避方法はありますでしょうか?
よろしくお願いします。


以下、サンプルコード
[CODE]

■親画面
TEST_OYA.aspx
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Btn子画面表示" runat="server" />
<asp:Button ID="Btn子画面の値取得" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
</form>

Class TEST_OYA

Protected Sub Btn子画面表示_Click()
Session("パラメータ") = Me.TextBox1.Text

Dim script As String
script = "if (showModalDialog('TEST_KO.aspx', window) == true){"
script += "document.getElementById("Btn子画面の値取得").click();"
script += "}"

ScriptManager.RegisterStartupScript(Me.Page, Me.Page.GetType, _
"子画面表示", script , True)
End Sub

Protected Sub Btn子画面の値取得_Click() Handles Btn子画面の値取得.Click
Me.TextBox1.Text = Session("パラメータ")
End Sub


■子画面
TEST_KO.aspx
<form id="form1" runat="server">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Btn閉じる" runat="server" Text="閉じる" />
</form>

Class TEST_KO

Protected Sub Page_Load() Handles Page.Load
If IsPostBack() = False Then
Me.TextBox1.Text = Session("パラメータ")
End If
End Sub

Protected Sub Btn閉じる_Click() Handles Btn閉じる.Click

Session("パラメータ") = Me.TextBox1.Text

Dim script As String
script = "window.returnValue = true;"
script += "window.close();"

Me.Page.ClientScript.RegisterStartupScript(Me.GetType, _
"子画面閉じる", script, True)
End Sub

[/CODE]
_________________
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2009-01-27 05:09
子画面から入力したデータを直接親画面のテキストボックスに表示させたら
どうでしょうか。

このサンプルが参考になるかと
http://jsajax.com/asp20/samples/060128-1.aspx
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
ned
会議室デビュー日: 2004/12/06
投稿数: 4
投稿日時: 2009-01-27 09:15
引用:

Accessさんの書き込み (2009-01-27 05:09) より:
子画面から入力したデータを直接親画面のテキストボックスに表示させたら
どうでしょうか。



ご掲示の方法で親画面に値を反映させることができました。

ただし、親子間で受け渡す項目数が多い事、
また、この子画面は複数の親画面での使用を考えておりますので
できればSession変数を利用したいと考えております。

回避方法、その他の方法ございましたら、よろしくお願いします。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2009-01-27 15:11
javascriptの使用方法があまり良くないような気がします。
以下、辺りを参照した方がよいのでは

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.button.onclientclick(VS.80).aspx
ned
会議室デビュー日: 2004/12/06
投稿数: 4
投稿日時: 2009-01-27 16:56
引用:

indigo-xさんの書き込み (2009-01-27 15:11) より:
javascriptの使用方法があまり良くないような気がします。
以下、辺りを参照した方がよいのでは

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.button.onclientclick(VS.80).aspx



以下の事を実現したいため、RegisterStartupScriptにてJavaScriptの登録を行っております。
・子画面表示直前に親画面の値をSeession変数に保存
・子画面を閉じる直前に子画面の値をSeession変数に保存=
レイル
常連さん
会議室デビュー日: 2008/10/14
投稿数: 37
投稿日時: 2009-01-30 15:33
引用:

1.子画面表示直前に親画面の値をSeession変数に保存
2.子画面を閉じる直前に子画面の値をSeession変数に保存=


2.returnValueを使用すれば良いのでは?
 ","(カンマ)区切りのデータにして
 String.Format("window.returnValue='{0}' + ',' + '{1}'; window.close();", data1.ToString, data1.ToString)
 # 書き方ってこれで良いんでしたっけ?

1.子画面に渡すデータはsessionでも良いですが、モーダルなので、
 showModalDialog('TEST_KO.aspx?DATA=' + カンマ区切りのデータ, window)
 子画面では
 Request.QueryString.Item("DATA")で値が取れます。
 話はそれましたが、showModalDialog()から戻り値を受けて、
 splitして各コントロールに値を入れてあげるのはどうでしょう?

ned
会議室デビュー日: 2004/12/06
投稿数: 4
投稿日時: 2009-02-03 00:20
returnValueは配列を格納することもできたので
多くの項目の受け渡しにはよさそうです。
また親画面側の処理で子画面からの値を親画面に設定できるので
共通で使用する子画面→親画面の値渡しにも向いていそうです。

皆様ありがとうございました。
1

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