質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

3123閲覧

アコーディオンの中のコントロールをtriggerに登録したい

teretail

総合スコア22

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2018/09/12 05:19

編集2018/09/12 05:39

前提・実現したいこと

アコーディオンの中に配置したコントロールからのポストバックで
UpdatePanelの更新をしたい。

発生している問題・エラーメッセージ

アコーディオンの中に配置されているコントロールを
アコーディオンの外にあるUpdatePanelのトリガーに設定しようとすると見つからないと言われます。

InvalidOperationException: UpdatePanel 'updatePanel1' のトリガー用の ID 'button1' のコントロールが見つかりませんでした。

該当のソースコード

aspx

1<ajaxToolkit:Accordion ID="accordion1" runat="server" HeaderCssClass="accordionHeader" ContentCssClass="accordionContent" RequireOpenedPane="false" FadeTransitions="False" FramesPerSecond="30" TransitionDuration="300" AutoSize="Limit" Width="500px" Height="500px"> 2 <Panes> 3 <ajaxToolkit:AccordionPane runat="server"> 4 <Header>ヘッダー</Header> 5 <Content> 6 <asp:Button ID="button1" Text="ボタン1" runat="server" /> 7 <asp:Button ID="button2" Text="ボタン2" runat="server" /> 8 </Content> 9 </ajaxToolkit:AccordionPane> 10 </Panes> 11</ajaxToolkit:Accordion> 12<asp:UpdatePanel ID="updatePanel1" runat="server"> 13 <ContentTemplate> 14 <asp:Label ID="label1" runat="server"></asp:Label> 15 </ContentTemplate> 16 <Triggers> 17 <asp:AsyncPostBackTrigger ControlID="button1" /> 18 </Triggers> 19</asp:UpdatePanel>

試したこと

トリガーを以下のように変更したところ、正常に実行できました。

aspx

1<asp:AsyncPostBackTrigger ControlID="ctl04$button1" />

ただし、これはたまたまbutton1のidがctl00_ContentPlaceHolder1_ctl04_button1であったため動きましたが、
ctl04の部分は自動的に採番されているため、何かの拍子に変わってしまうとまたエラーになってしまいます。

正しい対応の仕方をご存知でしたら、ご教示ください。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015
.NET Framework 4.6.2
jQuery 3.1.1
AjaxControlToolkit 16.1.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/12 05:32 編集

ajax control toolkit のバージョンは?
teretail

2018/09/12 05:40

16.1.1です。補足情報に追記しました。
guest

回答1

0

ベストアンサー

Visual Studio 2015 で[Web フォーム]のテンプレートを利用してプロジェクトを自動生成し、それに含まれるマスターページ Site.master を使っているということで良いですか? さらに、Ajax Control Toolkit 用のスクリプトのバンドルもできているということで良いですか? その前提で話をします。

もしそうでなければ、以下の記事を参考に、ScriptManager へのスクリプトの登録をしてください。

ASP.NET 4.5 ScriptManager
http://surferonwww.info/BlogEngine/post/2018/04/23/aspnet-45-scriptmanager.aspx

Ajax Control Toolkit スクリプト バンドル
http://surferonwww.info/BlogEngine/post/2018/06/10/bundling-script-and-css-files-on-ajax-control-toolkit.aspx

理由は不明ですが、Accordion に配置した Button を .aspx ページの、

<Triggers> <asp:AsyncPostBackTrigger ControlID="xxxxx" /> </Triggers>

で xxxxx に設定するのは ID ではなく UniqueID を使う必要があるようです。UniqueID は Control が html にレンダリングされた時に name 属性に付与される値と同じになるはずです。

しかし、name 属性の値をコピーして使うのは、質問者さんが懸念されたとおり「何かの拍子に変わってしまう」という問題がありそうです。

別の方法として、コードビハインドで ScriptManager.RegisterAsyncPostBackControl メソッドを利用して button1 を非同期ポストバックのトリガに設定するという手段があります。

具体的には、まずマスターページ Site.master の既存の ScriptMamager に id="ScriptManager1" というように id を付与し、当該ページのコードビハインド .aspx.cs で以下のようにします。

protected void Page_Load(object sender, EventArgs e) { Button btn = (Button)Accordion1.FindControl("button1"); ScriptManager manager = (ScriptManager)Page.Master.FindControl("ScriptManager1"); if (btn != null && manager != null) { manager.RegisterAsyncPostBackControl(btn); } }

.aspx の <Triggers> ... </Triggers> は不要になるので削除してください。

投稿2018/09/12 08:16

編集2018/09/12 08:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teretail

2018/09/12 09:38

なるほど、やはりaspx上で定義するのは無理がありそうですね。 教えて頂いたScriptManagerを使う方法で実装したところ、期待通りの動きができました。 トリガーとなるコントロールや、UpdatePanelが増えた場合は 各イベントで適切にUpdate()の呼び出しをしなければなりませんが、 name属性が変わってしまうリスクを抱えるよりは良いですね。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問