23

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

我在网上找到的标准解决方案是将登录控件包含在面板中,然后设置面板默认按钮。但显然,如果页面有母版页,那效果就不太好了。我尝试在代码中使用控件.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"

基本上,您不仅可以在表单级别定义 DefaultButton,还可以在单​​个面板级别定义 DefaultButton,只要焦点在面板内,如果您按“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

听起来登录按钮被吐出<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 回答
2

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

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

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

对于“输入”仅在登录控件内提交,将登录控件包装在 asp:Panel 中并 DefaultButton="Login1$LoginButton"在面板上设置

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

于 2010-08-05T21:28:16.337 回答
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

通过将登录控件嵌入到面板控件中并将defaultbutton面板的设置为登录控件内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>
于 2010-12-24T04:36:05.937 回答
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>

那应该为你做。

于 2011-07-26T17:12:27.807 回答