- - PR -
Javascriptでのボタンclickによる非同期ポストバック時のUpdatePanel更新
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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] _________________ | ||||
|
投稿日時: 2009-01-27 05:09
子画面から入力したデータを直接親画面のテキストボックスに表示させたら
どうでしょうか。 このサンプルが参考になるかと http://jsajax.com/asp20/samples/060128-1.aspx _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2009-01-27 09:15
ご掲示の方法で親画面に値を反映させることができました。 ただし、親子間で受け渡す項目数が多い事、 また、この子画面は複数の親画面での使用を考えておりますので できればSession変数を利用したいと考えております。 回避方法、その他の方法ございましたら、よろしくお願いします。 | ||||
|
投稿日時: 2009-01-27 15:11
javascriptの使用方法があまり良くないような気がします。
以下、辺りを参照した方がよいのでは http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.button.onclientclick(VS.80).aspx | ||||
|
投稿日時: 2009-01-27 16:56
以下の事を実現したいため、RegisterStartupScriptにてJavaScriptの登録を行っております。 ・子画面表示直前に親画面の値をSeession変数に保存 ・子画面を閉じる直前に子画面の値をSeession変数に保存= | ||||
|
投稿日時: 2009-01-30 15:33
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して各コントロールに値を入れてあげるのはどうでしょう? | ||||
|
投稿日時: 2009-02-03 00:20
returnValueは配列を格納することもできたので
多くの項目の受け渡しにはよさそうです。 また親画面側の処理で子画面からの値を親画面に設定できるので 共通で使用する子画面→親画面の値渡しにも向いていそうです。 皆様ありがとうございました。 |
1