23

Login コントロールを含む ASP.NET Web ページがあります。Enter キーを押しても、ログイン ボタンが起動しません。代わりに、何もせずにページが送信されます。

私がオンラインで見つけた標準的な解決策は、Login コントロールを Panel で囲み、Panel のデフォルト ボタンを設定することです。しかし、ページにマスター ページがある場合は、うまく機能しないようです。コントロール.ID、コントロール.ClientID、およびコントロール.UniqueIDを使用してコードでデフォルト ボタンを設定しようとしましたが、いずれの場合も次のようになります。

panelName の DefaultButton は、タイプ IButtonControl のコントロールの ID でなければなりません。

JavaScript でこれを行う方法があると確信していますが、可能であれば単純な古い C# コードでそれを行いたいと思っています。出来ますか?

4

9 に答える 9

34

これは役立つはずです:http ://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx

以下を使用して、ログインコントロールテンプレート内のボタンを参照できます。

DefaultButton="Login$LoginButton"

基本的に、デフォルトボタンはフォームレベルだけでなく、個々のパネルレベルでも定義できます。フォーカスがパネル内にある限り、「Enter」キーを押すとパネルのデフォルトボタンが使用されます。

于 2008-10-14T16:30:01.120 に答える
8

ブレンドマスターの素晴らしい回答!基本的には Panel.DefaultButton を使用するだけですが、正確に何を設定する必要があるかについての混乱を解消したいと思います。「.ID」や「.UniqueID」だけではありません。ドキュメントにはこれが少し欠けています。

パネルの名前付けコンテナーの UniqueIDに関連する、ボタンの UniqueID に設定する必要があります。たとえば、パネルの UniqueID が「Body$Content$pnlLogin」で、ログイン ボタンの UniqueID が「Body$Content$ucLogin$btnLogin」の場合 (「ucLogin」というコントロール内にあるため)、Panel.DefaultButton を次のように設定する必要があります。 "ucLogin$btnLogin".

これは、次のコードで解決できます。(このためのクラス ライブラリ メソッドは見つかりませんでしたが、見つけたら教えてください。)

void SetDefaultButton(Panel panel, IButtonControl button)
{
    string uniqueId = ((Control)button).UniqueID;
    string panelIdPrefix = panel.NamingContainer.UniqueID + Page.IdSeparator;

    if (uniqueId.StartsWith(panelIdPrefix))
    {
        uniqueId = uniqueId.Substring(panelIdPrefix.Length);
    }

    panel.DefaultButton = uniqueId;
}
于 2009-01-12T01:54:05.613 に答える
4

ページの読み込みでこのようなものを追加する必要があります...

txtPassword.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" + lnkSubmit.UniqueID + "','')")

パスワードテキストボックスにはonKeyPress属性が追加されており、「Enter」キーが押された場合に送信ボタンでdoPostBackを強制します。これは、送信ボタンのクリックをシミュレートします。

于 2008-10-14T16:10:27.273 に答える
2

Login1がログインコントロールのIDであると仮定します。

送信するページの任意の場所に「入力」するには、コードビハインドのinitに追加します。

protected void Page_Init(object sender, EventArgs e)
{
    this.Form.DefaultButton = Login1.FindControl("LoginButton").UniqueID;
}

ログインコントロール内でのみ送信する「enter」の場合、ログインコントロールをasp:Panelでラップし、パネルに設定 DefaultButton="Login1$LoginButton"します

どちらのアプローチもマスターページで正常に機能します。

于 2010-08-05T21:28:16.337 に答える
2

<input type="button">ログインボタンがではなくとして吐き出されているように聞こえます<input type="submit">。LoginControlをテンプレート化し、送信ボタンを追加して、恐ろしいデフォルトのマークアップを同時に取り除くことができます。

これを修正するためにJavascriptを使用する必要がある場合、何かが深刻に間違っています!(しかし、それはあなたがこれを知っているように聞こえます)

于 2008-10-14T16:26:51.000 に答える
2

よ、ネットでこの解決策を見つけました。うまくいきました。

 <asp:Panel ID="panelLogin" runat="server" DefaultButton="Login1$LoginButton">
 <asp:Login ID="Login1" runat="server" >
 <LayoutTemplate>
 ...
 <asp:Button  ID="LoginButton" .../>
 </LayoutTemplate>
 </asp:Login>
 </asp:Panel>
于 2010-06-10T13:32:33.333 に答える
1

上記の投稿にもう少し詳細と手順を追加するために、ここにウォークスルーがあります:

ログインコントロールをロードするページのマークアップでは、2か所でhtmlを更新する必要があります。

まず、ページのフォームタグで、デフォルトのボタンを設定する必要があります。私が名前を思いついた方法については、以下を参照してください。

<form id="form1" runat="server" defaultbutton="ucLogin$btnSubmit">

(命名:ドル記号の前のucLogin部分は、ページのさらに下で宣言されているように、ログインコントロールのIDである必要があります。btnSubmit部分は、ログインコントロールのhtmlで指定されているボタンのIDである必要があります)

次に、ログインコントロールの宣言をパネルでラップし、そのDefaultButtonプロパティも設定する必要があります。

<!-- Login Control - use a panel so we can set the default button -->
<asp:Panel runat="server" ID="loginControlPanel" DefaultButton="ucLogin$btnSubmit">                         
     <uc:Login runat="server" ID="ucLogin"/>                                                    
</asp:Panel>

それはあなたのためにそれをするはずです。

于 2011-07-26T17:12:27.807 に答える
1


あなたの良い答えに基づいて、フォーカスされているパネルに基づいて、ページにいくつかのデフォルト ボタンを設定できるカスタム コントロールを作成しました。
Panel の OnLoad メソッドと DefaultButton プロパティをオーバーライドします。

public class DefaultButtonPanel:Panel
{
    protected override void OnLoad(EventArgs e)
    {
        if(!string.IsNullOrEmpty(DefaultButton))
        {
            LinkButton btn = FindControl(DefaultButton) as LinkButton;
            if(btn != null)
            {
                Button defaultButton = new Button {ID = DefaultButton.Replace(Page.IdSeparator.ToString(), "_") + "_Default", Text = " "};
                defaultButton.Style.Add("display", "none");
                PostBackOptions p = new PostBackOptions(btn, "", null, false, true, true, true, true, btn.ValidationGroup);
                defaultButton.OnClientClick = Page.ClientScript.GetPostBackEventReference(p) + "; return false;";
                Controls.Add(defaultButton);
                DefaultButton = defaultButton.ID;
            }
        }
        base.OnLoad(e);
    }

    /// <summary>
    /// Set the default button in a Panel.
    /// The UniqueID of the button, must be relative to the Panel's naming container UniqueID. 
    /// 
    /// For example:
    /// Panel UniqueID is "Body$Content$pnlLogin" 
    /// Button's UniqueID is "Body$Content$ucLogin$btnLogin" 
    /// (because it's inside a control called "ucLogin") 
    /// Set Panel.DefaultButton to "ucLogin$btnLogin".
    /// </summary>
    /// <param name="panel"></param>
    /// <param name="button"></param>
    public override string DefaultButton
    {
        get
        {
            return base.DefaultButton;
        }

        set
        {
            string uniqueId = value;
            string panelIdPrefix = this.NamingContainer.UniqueID + Page.IdSeparator;
            if (uniqueId.StartsWith(panelIdPrefix))
            {
                uniqueId = uniqueId.Substring(panelIdPrefix.Length);
            }
            base.DefaultButton = uniqueId;
        }
    }      
}
于 2009-05-21T15:14:02.463 に答える
1

パネル コントロール内にログイン コントロールを埋め込み、パネルの をログイン コントロール内defaultbuttonParent$IDボタンの に設定することで、解決策が提供されます。コードがあります:

<asp:Panel id="panel1" runat="server" DefaultButton="Login1$LoginButton">
<asp:Login ID="Login1" runat="server" BackColor="#F7F6F3">
<LayoutTemplate>
<table>
...
<tr>
<td><asp:Button ID="LoginButton" runat="server" /></td>
</tr>
</table>
</LayoutTemplate>
</asp:Login>
</asp:Panel>
于 2010-12-24T04:36:05.937 に答える