Кнопка "Подтвердить вход", когда я нажимаю Enter

У меня есть веб-страница 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#, если это возможно. Является ли это возможным?

Не бойтесь в этом случае javascript. Это сэкономит вам много времени и головной боли.

StingyJack 14.10.2008 20:12

Я не страх это, но меня раздражает то, что должен быть способ сделать это в коде, и я не могу понять, что это такое.

Ryan Lundy 14.10.2008 20:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
2
40 535
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

вам нужно добавить что-то подобное при загрузке страницы ...

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, который является кнопкой входа в систему

roryf 14.10.2008 21:51
Ответ принят как подходящий

Это должно быть полезно: 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.

Ryan Lundy 14.10.2008 21:05

Вы пробовали что-то подобное? ((LoginForm.FindControl ("LoginButton")) как кнопка) .UniqueID

Vassili Altynikov 14.10.2008 21:25

Ага, попробовал, и ничего не вышло. FindControl действительно работает (я мог видеть это в отладчике), но по какой-то причине DefaultButton требует специального формата идентификатора.

Ryan Lundy 14.10.2008 21:40

Оказывается, вам просто нужно использовать то же значение в коде программной части: pnlLogin.DefaultButton = "Login1LoginButton";

Vassili Altynikov 15.10.2008 03:44

Я совершенно забыл о DefaultButton на панелях. Спасибо за напоминание.

Rismo 22.04.2009 03:14

Просто к сведению всех, кто использует ImageButton ... вам нужно будет использовать DefaultButton = "Login $ LoginImageButton".

Mike Cole 17.08.2009 22:21

Спасибо Blend Master! это так полезно

M.Hasan 23.02.2011 09:54

@MikeC. Просто хочу сообщить, что это полезно для меня: D

Sarawut Positwinyu 27.09.2011 15:00

Отличный ответ от Мастер смешивания! По сути, просто используйте 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;
}

ответ евгения сработал для меня, почти так же, как мастер смешивания, но со знаком доллара

System24 Tech 23.02.2011 09:55

Основываясь на ваших хороших ответах, сделал настраиваемый элемент управления, который
позволяет странице иметь несколько кнопок по умолчанию в зависимости от того, какая панель находится в фокусе. Он переопределяет метод 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>

Это должно сделать это за вас.

Другие вопросы по теме