按Enter键时提交登录控制按钮

我有一个带有Login控件的ASP.NET网页。 当我按Enter键时,“登录”按钮不会触发; 相反,页面提交,什么都不做。

我在网上找到的标准解决方案是将Login控件封装在Panel中,然后设置Panel默认按钮。 但是,如果页面有母版页,那么显然效果不佳。 我已经尝试在控件 .ID, 控制 .ClientID和控制 .UniqueID的代码中设置默认按钮,并且在每种情况下我得到:

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

我确信有一种方法可以用JavaScript来做到这一点,但如果可能的话,我真的很想用普通的旧C#代码来做。 可能吗?

这应该是有用的: http : //weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx

您可以使用以下内容引用Login控件模板中的按钮:

DefaultButton="Login$LoginButton" 

基本上,您不仅可以在Form级别定义DefaultButton,还可以在单​​个Panel级别定义DefaultButton,只要焦点在面板内,如果点击“Enter”,将使用面板的默认按钮

Blend Master精彩回答! 基本上只是使用Panel.DefaultButton,但我想澄清一下您需要将其设置为什么的混淆。 它不只是“。ID”或“.UniqueID” – 文档有点缺乏。

您必须将其设置为相对于 Panel的命名容器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; } 

你必须在页面加载中添加这样的东西……

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

密码文本框添加了onKeyPress属性,如果按下“Enter”键,将强制提交按钮上的doPostBack。 这模拟了单击提交按钮。

哟,我在网上找到了这个解决方案,它对我有用。

     ...     

假设Login1是您的登录控件的ID。

要在页面的任何位置“输入”提交,请在代码隐藏中添加到init:

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

对于’enter’只在登录控件内部提交时,将登录控件包装在asp:Panel中并在面板上设置DefaultButton="Login1$LoginButton"

两种方法都适用于母版页。

听起来像登录按钮是而不是 。 你总是可以模板化LoginControl并添加提交按钮,同时摆脱可怕的默认标记!

如果你必须使用Javascript来解决这个问题严重错误! (但听起来你知道这个)

要在上面的post中添加更多细节和说明,这里是一个演练:

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

首先,在页面的表单标签中,您需要设置默认按钮。 请参阅下文,了解我如何提出这个名字。

 

(命名:美元符号之前的u​​cLogin部分需要是您的登录控件的ID,如在页面中进一步声明的那样.btnSubmit部分需要是按钮的ID,因为它在登录控件的html中命名)

接下来,您需要在面板中包装登录控件的声明,并设置它的DefaultButton属性:

     

那应该为你做。

根据你的好答案,制作一个自定义控件
使页面具有多个默认按钮,基于哪个面板是焦点。
它会覆盖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); } ///  /// 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". ///  ///  ///  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; } } } 

通过在面板控件中嵌入登录控件并将面板的defaultbutton按钮设置为Login控件中的按钮的Parent$ID ,可以提供解决方案。 有代码:

     ...