按下回车键时提交登录控制按钮

23

我有一个带有登录控件的ASP.NET网页。当我按下Enter键时,登录按钮不会触发;相反,页面提交但却没有任何操作。

我在网上找到的标准解决方案是将登录控件放在一个Panel中,然后设置Panel的默认按钮。但是,如果页面有主页面,似乎这样做效果不太好。我尝试使用control.ID、control.ClientID和control.UniqueID在代码中设置默认按钮,但每次都会收到以下错误提示:

panelName的DefaultButton必须是IButtonControl类型的控件的ID。

我相信可以通过JavaScript实现这个目标,但如果可能的话,我真的想用纯粹的C#代码来完成。这可行吗?


不要害怕这种情况下的JavaScript。它会为您节省很多头疼和时间。 - StingyJack
我并不害怕,但是让我恼火的是,代码中应该有一种方法可以实现它,而我却想不出来。 - Ryan Lundy
9个回答

34

可以这样做,但是出于某些原因我不能在代码中实现。无论是ID、ClientID还是UniqueID都无法为Panel的DefaultButton属性生成正确的ID格式。 - Ryan Lundy
原来你只需要在代码后端使用相同的值: pnlLogin.DefaultButton = "Login1LoginButton"; - Vassili Altynikov
3
提醒一下其他使用 ImageButton 的人... 你需要使用 DefaultButton="Login$LoginImageButton"。 - Mike Cole
谢谢您,混合大师!这非常有帮助。 - M.Hasan
@MikeC。只是想让您知道,这对我很有用 :D - Sarawut Positwinyu
显示剩余3条评论

8
Blend Master 的回答很好!只需要使用 Panel.DefaultButton,但我想澄清一下关于你需要设置什么的混淆。它不仅是 ".ID" 或者 ".UniqueID" - 文档对此有点欠缺。
你必须将其设置为该按钮的 UniqueID,相对于 Panel 命名容器的 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;
}

Evgeny的答案对我有用,几乎与Blend Master相同,但包括美元符号。 - Starjumper Tech SL

4

您需要在页面加载时添加以下内容...

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

密码文本框添加了onKeyPress属性,如果按下“Enter”键,则会在提交按钮上强制执行doPostBack。这模拟了点击提交按钮的操作。


2
似乎登录按钮被输出为<input type="button">而不是<input type="submit">。您可以模板化LoginControl并添加提交按钮,同时摆脱丑陋的默认标记!
如果必须使用Javascript来解决此问题,则存在严重问题!(但是看起来您已经知道了这一点)

澄清一下 - 将该属性添加到您的 asp:Button 控件中,即登录按钮。 - roryf

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>

2
假设Login1是您的登录控件ID。
要在页面上任何位置使用“enter”提交,需要在代码后端的初始化中添加以下内容:
protected void Page_Init(object sender, EventArgs e)
{
    this.Form.DefaultButton = Login1.FindControl("LoginButton").UniqueID;
}

如果希望“Enter”键只在登录控件内部提交,请将登录控件包装在asp:Panel中,并设置DefaultButton =“Login1 $ LoginButton” 在面板上。

使用母版页两种方法都可以正常工作。


1

为了在上面的帖子中添加更多详细说明和指导,以下是一步一步的操作:

在加载登录控件的任何页面的标记中,您需要在两个位置更新HTML。

首先,在页面的表单标记中,您需要设置默认按钮。请参见下面的内容,了解我如何得出名称。

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

(命名:美元符号前的ucLogin部分需要是您登录控件的ID,就像在页面中进一步声明的那样。btnSubmit部分需要是按钮的ID,就像在登录控件的HTML中命名的那样)
接下来,您需要将登录控件的声明包装在一个面板中,并设置其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>

这应该对你有用。


1

通过将登录控件嵌入面板控件中,并将面板的defaultbutton设置为Login控件内按钮的Parent$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>

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;
        }
    }      
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接