当我点击Enter时,提交登录控制按钮
本文关键字:提交 登录 控制 按钮 Enter | 更新日期: 2023-09-27 17:48:50
我有一个带有Login控件的ASP.NET网页。当我点击Enter时,Login按钮不会启动;相反,页面提交,什么也不做。
我在网上找到的标准解决方案是将Login控件包含在Panel中,然后设置Panel默认按钮。但显然,如果页面有母版页,那么效果就不太好了。我试着用control.ID、control.ClientID和control.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
您可以使用以下内容引用登录控制模板中的按钮:
DefaultButton="Login$LoginButton"
基本上,您不仅可以在Form级别上定义DefaultButton,还可以在单个Panel级别上定义它,只要焦点在面板内,如果您点击"Enter"
混合大师的精彩回答!基本上只需使用Panel.DefaultButton,但我想澄清一下您需要将其设置为什么的困惑。它不仅仅是".ID"或".UniqueID",文档对此有点缺乏。
您必须将其设置为按钮的UniqueID,相对于面板的命名容器UniqueID。例如,如果您的面板UniqueID为"Body$Content$pnlLogin",并且登录按钮的UniqueID是"Body''Content$ucLogin$btnLogon"(因为它位于名为"ucLogin"的控件内),则需要将panel.Default button设置为"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。这模拟单击提交按钮。
Yo,我在网上找到了这个解决方案,它对我有效。
<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>
假设Login1是登录控件的ID。
对于要提交的页面上的任何位置的"输入",请添加到代码库中的init:
protected void Page_Init(object sender, EventArgs e)
{
this.Form.DefaultButton = Login1.FindControl("LoginButton").UniqueID;
}
要使"enter"仅在登录控件内提交,请将登录控件包装在asp:Panel中并设置面板上的DefaultButton="Login1$LoginButton"
这两种方法都适用于母版页。
听起来登录按钮被吐出为<input type="button">
而不是<input type="submit">
。您可以始终对LoginControl进行模板化,并添加提交按钮,同时消除可怕的默认标记!
如果你必须使用Javascript来修复这个问题,那就大错特错了!(但听起来你知道这一点)
要为上面的帖子添加更多细节和说明,下面是一个演练:
在加载登录控件的任何页面的标记中,您需要在两个位置更新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>
这应该对你有用。
基于您的好答案,创建了一个自定义控件
使页面根据聚焦的面板具有多个默认按钮
它覆盖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;
}
}
}
通过将登录控件嵌入面板控件中,并将面板的defaultbutton
设置为login控件works中按钮的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>