У меня есть веб-страница ASP.NET с элементом управления для входа в систему. Когда я нажимаю Enter, кнопка Login не срабатывает; вместо этого страница отправляется, ничего не делая.
Стандартное решение этой проблемы, которое я нашел в Интернете, - заключить элемент управления Login в Panel, а затем установить кнопку Panel по умолчанию. Но, по-видимому, это не так хорошо работает, если на странице есть главная страница. Я пробовал установить кнопку по умолчанию в коде с контроль.ID, контроль.ClientID и контроль.UniqueID, и в каждом случае я получаю:
The DefaultButton of panelName must be the ID of a control of type IButtonControl.
Я уверен, что есть способ сделать это с помощью JavaScript, но мне бы очень хотелось сделать это с помощью простого старого кода C#, если это возможно. Является ли это возможным?
Я не страх это, но меня раздражает то, что должен быть способ сделать это в коде, и я не могу понять, что это такое.





вам нужно добавить что-то подобное при загрузке страницы ...
txtPassword.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" + lnkSubmit.UniqueID + "','')")
в текстовое поле пароля добавлен атрибут onKeyPress, который принудительно вызывает doPostBack на кнопке отправки, если нажата клавиша «Enter». Это имитирует нажатие кнопки отправки.
Похоже, что кнопка входа в систему выплевывается как <input type = "button">, а не <input type = "submit">. Вы всегда можете создать шаблон LoginControl и добавить кнопку отправки, одновременно избавившись от ужасной разметки по умолчанию!
Если вам нужно использовать Javascript, чтобы исправить это, что-то серьезно не так! (но тогда похоже, что вы это знаете)
Чтобы уточнить - добавьте этот атрибут в свой элемент управления asp: Button, который является кнопкой входа в систему
Это должно быть полезно: http://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx
Для ссылки на кнопку в шаблоне элемента управления входом можно использовать следующее:
DefaultButton = "Login$LoginButton"
По сути, вы можете определить DefaultButton не только на уровне формы, но и на уровне отдельной панели, пока фокус находится внутри панели, кнопка по умолчанию для панели будет использоваться, если вы нажмете «Enter»
Это работает, но я почему-то не могу сделать это в коде. Ни ID, ни ClientID, ни UniqueID не создают правильный формат идентификатора для свойства DefaultButton Panel.
Вы пробовали что-то подобное? ((LoginForm.FindControl ("LoginButton")) как кнопка) .UniqueID
Ага, попробовал, и ничего не вышло. FindControl действительно работает (я мог видеть это в отладчике), но по какой-то причине DefaultButton требует специального формата идентификатора.
Оказывается, вам просто нужно использовать то же значение в коде программной части: pnlLogin.DefaultButton = "Login1LoginButton";
Я совершенно забыл о DefaultButton на панелях. Спасибо за напоминание.
Просто к сведению всех, кто использует ImageButton ... вам нужно будет использовать DefaultButton = "Login $ LoginImageButton".
Спасибо Blend Master! это так полезно
@MikeC. Просто хочу сообщить, что это полезно для меня: D
Отличный ответ от Мастер смешивания! По сути, просто используйте Panel.DefaultButton, но я хочу устранить путаницу в том, что именно вам нужно установить. Это не просто ".ID" или ".UniqueID" - в документации немного по этому поводу.
Вы должны установить для него значение UniqueID кнопки, относительно уникального идентификатора контейнера именования Panel. Например, если 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;
}
ответ евгения сработал для меня, почти так же, как мастер смешивания, но со знаком доллара
Основываясь на ваших хороших ответах, сделал настраиваемый элемент управления, который
позволяет странице иметь несколько кнопок по умолчанию в зависимости от того, какая панель находится в фокусе.
Он переопределяет метод 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;
}
}
}
Йо, я нашел это решение в сети, оно сработало для меня.
<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 - это идентификатор вашего элемента управления входом.
Чтобы ввести 'Enter' в любом месте страницы для отправки, добавьте в init в свой код программной части:
protected void Page_Init(object sender, EventArgs e)
{
this.Form.DefaultButton = Login1.FindControl("LoginButton").UniqueID;
}
Чтобы 'enter' отправлялся только внутри элемента управления входом, оберните элемент управления входом в asp: Panel и установите
DefaultButton = "Login1$LoginButton" на панели
Оба подхода отлично работают с мастер-страницами.
Решение предоставляется путем встраивания элемента управления входом в элемент управления панелью и установки 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>
Чтобы добавить немного больше деталей и инструкций к сообщениям выше, вот пошаговое руководство:
В разметке любых страниц, которые загружают ваш элемент управления входом, вам необходимо обновить 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>
Это должно сделать это за вас.
Не бойтесь в этом случае javascript. Это сэкономит вам много времени и головной боли.