読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

ConfirmButtonExtenderがうまく動かない?

ASP.NET AJAX

Ajax ControlToolkitのConfirmButtonExtenderが、なんかうまいこと動いてくれません。

いや、それだと語弊があって、ConfirmButtonExtender単体だと期待通りに動いてくれるんだけれど、検証コントロール(RequiredFieldValidatorやらの、ビルトインの***Validator)と組み合わせて、@ITの記事にある、『すべての検証項目をパスした場合にのみ確認ダイアログを表示する』という動作をさせようとすると、うまくいかない。

たぶん、記事の通りだと思うのだけれど、以下の設定だと、RequiredFieldValidatorをパス出来ない(=TextBoxが空のままの)状態にも関わらず、ConfirmButtonExtenderで設定したconfirmが表示され、OKするとそのままサーバにポストバックされてしまう。その際にサーバサイドでIsValidを確認すると、当然ながらFalse。

<!-- bodyの中のみ抜粋。 -->
<body>
  <form id="form1" runat="server">
    <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
    </cc1:ToolkitScriptManager>
    <div>
      <asp:TextBox ID="txt1" runat="server"></asp:TextBox>
      <asp:Button ID="btn1" runat="server" Text="Button" OnClick="Button1_Click" />
      <asp:RequiredFieldValidator ID="rfv1" runat="server" ErrorMessage="ERROR"
                                  ControlToValidate="txt1">
      </asp:RequiredFieldValidator>
      <cc1:ConfirmButtonExtender ID="cbf1" runat="server" ConfirmOnFormSubmit="True"
                                 ConfirmText="Are you OK?" TargetControlID="btn1">
      </cc1:ConfirmButtonExtender>
    </div>
  </form>
</body>

上記ではUpdatePanelは使っていないが、divの直下にUpdatePanelを配置、他のコントロールを入れ子にして非同期実行しても、結果は同じ。また、ValidationSummaryを使ったり、ValidationGroupを設定しても、挙動は変わらない。ToolkitScriptManagerをMS純正のScriptManagerに変えても変化なし*1


環境は、VS2005 PRO SP1 、Ajax ControlToolkitが1.0.11119.20010。また、VS2008 PROと3.0.11119.0でも、同様の結果。


一応、上記のButtonコントロールをLinkButtonに変えてやると、@ITの記事通り(期待通り)の動作になるのは確認したのだけれど、Buttonコントロールは動いてくれない。



@ITの記事で未検証ということは考えにくいので、考えられる点としては、おそらく

  1. 何かプロパティ設定が違う
    僕がポカをやっている可能性。一番疑うべきだろうけれど、職場で別の人も検証していて同じ結果だったので、ちょっと考えにくい気もしている。
  2. 環境の問題
    これももちろん有りうるが、複数の環境(クライアント、開発環境共)で起こっているので、可能性としてはそこまで高くない気もしている。
  3. Ajax ControlToolkitのバージョンの依存するバグ
    上記記事のタイムスタンプが2007/09/06。Ajax ControlToolkitのバージョンについては明記されていないので不明だが、少なくとも私の手元にあるのは現時点での最新版の1.0.11119.20010のタイムスタンプが2007/11/19なので、バージョンが異なるのは間違いない。

のどれかでこの差が発生しているのかなぁ、と考えていますが、実際はまだいろいろ検証すべき要素が多い気がするので、不明です。


実のところ、3番目、要するにデグッってるのが正解なんじゃないかな、とも思ってます。これを確認するには、過去バージョンの(2007/09/06以前のリリース)で確認するのが手っとりばやいんでしょうけど、それをやって結果がわかってもあんまり嬉しくない気もするし、この程度なら今までどおりOnClientClickで自作のConfirmなfunction作って設定しても、実質的に変わらない*2気もするので、気が向いたら検証してみる……かなぁ。

<追記>
やっぱり、ライブラリ側の問題らしい(上記3)
ConfirmButtonExtenderはやはり今、まともに動かないらしい。 - 三日坊主と呼ばせない!日記

*1:まあ、この辺りは変わってもらっても困る、という話もあるけれど。

*2:むしろデバッグ時にトレースし易いという気も。