Кнопка управления входом в систему «Отправить», когда я нажимаю Enter

StackOverflow https://stackoverflow.com/questions/201776

Вопрос

У меня есть веб-страница ASP.NET с элементом управления входом в систему.Когда я нажимаю Enter, кнопка «Войти» не срабатывает;вместо этого страница отправляется, ничего не делая.

Стандартное решение этой проблемы, которое я нашел в Интернете, — поместить элемент управления входом в панель, а затем установить кнопку панели по умолчанию.Но, очевидно, это не работает так хорошо, если на странице есть главная страница.Я попытался установить кнопку по умолчанию в коде с помощью контроль.ИДЕНТИФИКАТОР, контроль.ClientID и контроль.UniqueID, и в каждом случае я получаю:

DefaultButton PanelName должен быть идентификатором элемента управления типа IButtonControl.

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

Это было полезно?

Решение

Это должно быть полезно: http://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx

Для ссылки на кнопку в шаблоне элемента управления входом можно использовать следующее:

DefaultButton="Login$LoginButton"

По сути, вы можете определить кнопку DefaultButton не только на уровне формы, но и на уровне отдельной панели. Пока фокус находится внутри панели, кнопка по умолчанию для панели будет использоваться, если вы нажмете «Ввод».

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

Отличный ответ от Мастер смешивания!По сути, просто используйте Panel.DefaultButton, но я хочу прояснить путаницу относительно того, что именно вам нужно установить.Это не просто «.ID» или «.UniqueID» — документации по этому поводу немного не хватает.

Вы должны установить уникальный идентификатор кнопки, относительно контейнер именования Panel UniqueID.Например, если уникальный идентификатор вашей панели — «Body$Content$pnlLogin», а уникальный идентификатор вашей кнопки входа — «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;
}

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

txtPassword.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" + lnkSubmit.UniqueID + "','')")

в текстовое поле пароля добавлен атрибут onKeyPress, который принудительно вызывает doPostBack на кнопке отправки, если нажата клавиша «Enter».Это имитирует нажатие кнопки отправки.

Эй, я нашел это решение в сети, оно сработало для меня.

 <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 — это идентификатор вашего элемента управления входом.

Чтобы «ввести» в любом месте страницы для отправки, добавьте init в свой код:

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

Чтобы «ввод» отправлялся только внутри элемента управления входом, оберните элемент управления входом в asp:Panel и установитеDefaultButton="Login1$LoginButton" на панели

Оба подхода отлично работают с главными страницами.

Похоже, кнопку входа в систему выплевывают как <input type="button"> скорее, чем <input type="submit">.Вы всегда можете создать шаблон LoginControl и добавить кнопку отправки, одновременно избавившись от ужасной разметки по умолчанию!

Если вам приходится использовать Javascript, чтобы исправить это, что-то серьезно не так!(но тогда похоже, что ты это знаешь)

Чтобы добавить немного больше деталей и инструкций к сообщениям выше, вот пошаговое руководство:

В разметке любых страниц, загружающих ваш элемент управления входом, вам необходимо обновить 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>

Это должно помочь вам.

На основе ваших хороших ответов создал собственный элемент управления, который
позволяет странице иметь несколько кнопок по умолчанию в зависимости от того, какая панель находится в фокусе.
Он переопределяет метод OnLoad и свойство DefaultButton Panel.

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 панели на 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top