Отправить кнопку управления входом, когда я нажимаю Enter - PullRequest
22 голосов
/ 14 октября 2008

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

Стандартное решение, которое я нашел в Интернете, заключается в том, чтобы включить элемент управления Login в Panel, а затем установить кнопку Panel по умолчанию. Но, видимо, это не работает так хорошо, если страница имеет главную страницу. Я попытался установить кнопку по умолчанию в коде с control .ID, control .ClientID и control .UniqueID, и в каждом случае я получаю:

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

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

Ответы [ 9 ]

33 голосов
/ 14 октября 2008

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

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

DefaultButton="Login$LoginButton"

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

8 голосов
/ 12 января 2009

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

Вы должны установить его в UniqueID кнопки, относительно контейнера именования Panel 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;
}
4 голосов
/ 14 октября 2008

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

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

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

2 голосов
/ 06 августа 2010

Предполагая, что Login1 является идентификатором вашего контроля входа в систему.

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

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

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

Оба подхода отлично работают с мастер-страницами.

2 голосов
/ 10 июня 2010

Йо, я нашел это решение в сети, оно у меня сработало.

 <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>
2 голосов
/ 14 октября 2008

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

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

1 голос
/ 26 июля 2011

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

В разметке любых страниц, которые загружают ваш контроль входа, вам нужно обновить html в двух местах.

Сначала в теге формы страницы необходимо установить кнопку по умолчанию. Смотрите ниже, как я придумал имя.

<form id="form1" runat="server" defaultbutton="ucLogin$btnSubmit">

(Именование: часть ucLogin перед знаком доллара должна быть идентификатором вашего элемента управления входом в систему, как указано далее на вашей странице. Часть btnSubmit должна быть идентификатором кнопки, как указано в html-коде элемента управления входом ) * +1010 *

Далее вам нужно обернуть объявление вашего элемента управления для входа в панель и установить его свойство 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>

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

1 голос
/ 24 декабря 2010

Решение обеспечивается путем встраивания элемента управления входом в панель управления и установки 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>
1 голос
/ 21 мая 2009

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