Отправить кнопку входа в систему при нажатии Enter
У меня есть веб-страница ASP.NET с элементом управления Login. Когда я нажимаю Enter, кнопка Login не запускается; вместо этого страница отправляется, ничего не делая.
Стандартное решение для этого, которое я нашел в Интернете, заключается в том, чтобы вложить элемент управления Login в Panel, а затем установить кнопку Panel по умолчанию. Но, по-видимому, это работает не так хорошо, если страница имеет главную страницу. Я попытался установить кнопку по умолчанию в коде с control.ID, control.ClientID и control.UniqueID, и в каждом случае я получаю:
DefaultButton of panelName должен быть идентификатором элемента управления типа IButtonControl.
Я уверен, что есть способ сделать это с помощью JavaScript, но мне бы очень хотелось сделать это с помощью простого старого кода на С#, если это возможно. Возможно ли это?
Ответы
Ответ 1
Это должно быть полезно: http://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx
Вы можете использовать следующее для ссылки на кнопку в шаблоне управления Login:
DefaultButton="Login$LoginButton"
В принципе, вы можете определить DefaultButton не только на уровне формы, но и на отдельном уровне панели, если фокус находится внутри панели, кнопка по умолчанию для панели будет использоваться, если вы нажмете "Enter"
Ответ 2
Отличный ответ от мастера смешивания! По сути, просто используйте Panel.DefaultButton, но я хочу прояснить путаницу в том, что именно вам нужно установить. Это не просто ".ID" или ".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;
}
Ответ 3
вам нужно добавить что-то подобное в загрузку страницы...
txtPassword.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" + lnkSubmit.UniqueID + "','')")
в текстовом поле пароля добавлен атрибут onKeyPress, который заставит doPostBack на кнопку отправки, если нажата клавиша "Enter". Это имитирует нажатие кнопки отправки.
Ответ 4
Похоже, что кнопка входа выкладывается как <input type="button">
, а не <input type="submit">
. Вы всегда можете создать шаблон LoginControl и добавить кнопку отправки, избавившись от отвратительной разметки по умолчанию в то же время!
Если вам нужно использовать Javascript для исправления этого, это серьезно неверно! (но тогда это звучит так, как вы знаете это)
Ответ 5
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>
Ответ 6
Предполагая, что Login1 является идентификатором вашего элемента управления входами.
Для 'enter' в любом месте страницы для отправки добавьте init в свой код:
protected void Page_Init(object sender, EventArgs e)
{
this.Form.DefaultButton = Login1.FindControl("LoginButton").UniqueID;
}
Для 'enter' только для отправки, когда внутри элемента управления входами, оберните элемент управления входами в asp: Panel и установите
DefaultButton="Login1$LoginButton"
на панели
Оба подхода отлично работают с основными страницами.
Ответ 7
Основываясь на ваших хороших ответах, сделал собственный контроль, который
позволяет странице иметь несколько кнопок по умолчанию, на основе которых находится панель.
Он переопределяет метод 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 naming container UniqueID.
///
/// For example:
/// Panel UniqueID is "Body$Content$pnlLogin"
/// Button UniqueID is "Body$Content$ucLogin$btnLogin"
/// (because it 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;
}
}
}
Ответ 8
Решение предоставляется путем встраивания элемента управления входами в панель управления и установки 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>
Ответ 9
Чтобы добавить несколько подробностей и инструкции к сообщениям выше, прохождение:
В разметке любых страниц, загружающих элемент управления входами, вам необходимо обновить html в двух местах.
Во-первых, в теге формы страницы вам нужно установить кнопку по умолчанию. Ниже показано, как я придумал имя.
<form id="form1" runat="server" defaultbutton="ucLogin$btnSubmit">
(Именование: часть ucLogin перед знаком доллара должна быть идентификатором вашего элемента управления входами, как указано ниже на вашей странице. Часть btnSubmit должна быть идентификатором кнопки в качестве ее имени в элементах управления входами 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>
Это должно сделать это для вас.