【ASP.NET】デフォルト・ボタン

デフォルト・ボタンとは?

http://www.atmarkit.co.jp/fdotnet/dotnettips/731aspajaxfocus/aspajaxfocus.html
より

 * [Enter]キーを押下した場合に、該当するボタンにフォーカスが当たっていなくてもクリックされたものと見なされるボタン

で、こいつが結構やっかい。

特徴

 * typeがSubmitになっているボタンはデフォルトボタンの対象になる
 * サポートされるのは、Button および ImageButton コントロールのみ(LinkButton コントロールはサポート外っぽい)

参考文献

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.panel.defaultbutton.aspx

設定方法

Me.Form.DefaultButton = Me.【ボタンID】.UniqueID

参考文献

http://www.wednesdaymoon.net/kzweb/articles/aspnet/article.aspx?articleid=40
http://chang777.blog108.fc2.com/blog-entry-34.html#pagetop

デフォルト・ボタンを抑止する

案[1]HTMLタグを使用する

http://d.hatena.ne.jp/shige3110/20060609/1149836243
 * 「ImageButton コントロール→imgタグ」「Buttonコントロール→buttonタグ」に変更し、ServerClickを使用する
 * ServerClickについては以下を参照。
http://msdn.microsoft.com/ja-jp/library/system.web.ui.htmlcontrols.htmlbutton.serverclick%28v=vs.80%29.aspx

案[2]ダミーボタンを使用する

 * 以下のようなダミーボタンを追加し、Form.DefaultButtonにダミーボタンを設定
  + CSS で非表示にする(「注意」参照のこと)
  + ポストバックしないように「OnClientClick="return false;"」とする
 * 実システムならマスターページに組み込むのもあり。

注意

 * ダミーボタンをおいて、そのボタンをVibible=Falseにし、Form.DefaultButtonにダミーボタンを設定してもダメ(クライアント側ではVibible=Falseのものは生成されてこない)

サンプル

* マスターページに組み込んでいたら、システム共通になる
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm4.aspx.vb" Inherits="WebApplication1.WebForm4" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="">http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
      .hide  {
        visibility:hidden;
    }
    </style>
</head>
<body>
    <form id="form1" runat="server" defaultbutton="Button5">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" />
        <br />
        <asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
        <br />
        <asp:Button ID="Button2" runat="server" Text="Button" />
        <br />
        <button id="Button4" onserverclick=" button4_Click" runat="server">button</button><br />
        <asp:ImageButton ID="ImageButton1" runat="server" 
            ImageUrl="~/Images/expand.jpg" Width="16px" />
        <br />
        <asp:Button ID="Button3" runat="server" Text="Button" Visible="False" />
        <br />
        <asp:Button ID="Button5" runat="server" Text="ダミー隠しボタン"
         CssClass="hide" OnClientClick="return false;" />
    </div>
    </form>
</body>
</html>

補足

 * 感想として、デフォルト・ボタンの抑制はあくまで緊急処置であって、できれば設計段階でどれをデフォルトボタンにするかを決めておくのがBetterであると感じた。

サンプル:ServerClickについて

■デザイン
<button id="Button1" onserverclick=" button1_Click" runat="server">button</button><br />

■コード
Sub button1_Click(Source As Object, E As EventArgs)
    Me.Label1.Text = "Press Button1"
End Sub

Enter キーでの Submit を抑止する

form1.Attributes("onkeydown") = "if(event.keyCode==13){
                                    if(window.event.srcElement.type!='submit' && 
                                       window.event.srcElement.type!='textarea'){
                                       return false;
                                    }
                                 }"

参考文献

http://msdn.microsoft.com/ja-jp/library/cc766700.aspx