Envie o botão de controle de login quando eu apertar Enter

Eu tenho uma página da Web do asp.net com um controle de logon nele. Quando eu apertei Enter, o botão Login não dispara; em vez disso, a página envia, sem fazer nada.

A solução padrão para isso que encontrei on-line é colocar o controle Login em um painel e, em seguida, definir o botão padrão do painel. Mas aparentemente isso não funciona tão bem se a página tiver uma página mestra. Eu tentei definir o botão padrão no código com controle .ID, controle .ClientID e controle .UniqueID, e em cada caso eu obter:

O DefaultButton de panelName deve ser o ID de um controle do tipo IButtonControl.

Tenho certeza de que há uma maneira de fazer isso com JavaScript, mas eu realmente gostaria de fazer isso com o código C# simples, se possível. É possível?

22
Eu não temo isso, mas me faz pensar que deveria haver uma maneira de fazer isso no código e não consigo descobrir o que é.
adicionado o autor Ryan Lundy, fonte
Não tema o JavaScript neste caso. Vai poupar muita dor de cabeça e tempo.
adicionado o autor StingyJack, fonte

9 Respostas

This should be helpful: http://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx

Você pode usar o seguinte para referenciar o botão dentro do modelo de controle de Login:

DefaultButton="Login$LoginButton"

Basicamente, você pode definir um DefaultButton não apenas no nível Form, mas também no nível individual do Panel, contanto que o focus esteja dentro do painel, o botão padrão para o painel será usado se você apertar "Enter"

33
adicionado
Você salvou milhões de vidas !!!
adicionado o autor Sarawut Positwinyu, fonte
@MikeC Só quero que você saiba que é útil para mim: D
adicionado o autor Sarawut Positwinyu, fonte
Apenas um FYI para qualquer outra pessoa que usa um ImageButton ... você precisará usar DefaultButton = "Login $ LoginImageButton".
adicionado o autor Mike Cole, fonte
Isso funciona, mas por alguma razão eu não posso fazer isso no código. Nem o ID nem o ClientID nem o UniqueID produzem o formato de ID correto para a propriedade DefaultButton do painel.
adicionado o autor Ryan Lundy, fonte
Sim, tentei isso e não funcionou. FindControl realmente funciona (eu poderia vê-lo no depurador), mas por algum motivo, DefaultButton requer um formato de identificação especial.
adicionado o autor Ryan Lundy, fonte
Você já tentou algo assim? ((LoginForm.FindControl ("LoginButton")) como botão) .UniqueID
adicionado o autor Vassili Altynikov, fonte
Acontece que você simplesmente precisa usar o mesmo valor em code-behind: pnlLogin.DefaultButton = "Login1LoginButton";
adicionado o autor Vassili Altynikov, fonte
Eu esqueci completamente o DefaultButton nos painéis. Obrigado por me lembrar.
adicionado o autor Rismo, fonte

Excelente resposta por Blend Master ! Basicamente apenas use Panel.DefaultButton, mas eu quero esclarecer a confusão sobre o que exatamente você precisa configurá-lo. Não é apenas ".ID" ou ".UniqueID" - a documentação é um pouco carente disso.

Você deve configurá-lo para o UniqueID do botão, relativo ao ID do recipiente do painel UniqueID. Por exemplo, se o painel UniqueID for "Body $ Content $ pnlLogin" e o UniqueID do seu botão de login for "Body $ Content $ ucLogin $ btnLogin" (porque ele está dentro de um controle chamado "ucLogin"), será necessário definir Panel.DefaultButton como "ucLogin $ btnLogin".

Você pode resolver isso no código da seguinte maneira. (Eu não encontrei nenhum método de biblioteca de classes para isso, mas me avise se você encontrar um.)

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;
}
8
adicionado
A resposta de Evgeny funcionou para mim, quase o mesmo que o mestre da mistura, mas com o sinal de dólar incluído
adicionado o autor Marbella Consulting, fonte

você tem que adicionar algo assim no carregamento da página ...

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

a caixa de texto de senha tem um atributo onKeyPress adicionado que forçará um doPostBack no botão de envio se a tecla "Enter" for pressionada. Isso simula o clique no botão enviar.

4
adicionado
É exatamente assim que eu faço
adicionado o autor Andy Brudtkuhl, fonte

Parece que o botão de login está sendo cuspido como <input type = "button"> em vez de <input type = "submit"> . Você pode sempre modelar o LoginControl e adicionar o botão de envio, livrando-se da marcação padrão hedionda ao mesmo tempo!

Se você tiver que usar o Javascript para consertar isso, algo está seriamente errado! (mas parece que você sabe disso)

2
adicionado
Então, adicionando Command = "Login" deve fazer o truque não?
adicionado o autor roryf, fonte
Para esclarecer - adicione esse atributo ao seu asp: Button control que é o botão de login
adicionado o autor roryf, fonte
Ironicamente, o botão de login já está modelado.
adicionado o autor Ryan Lundy, fonte

Eu encontrei esta solução na net, funcionou para mim.

 
 
 
 ...
 
 
 
 
2
adicionado

Supondo que Login1 é o ID do seu controle de login.

Para "entrar" em qualquer lugar da página para enviar, adicione ao init no seu codebehind:

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

Para 'entrar' para enviar somente quando dentro do controle de login, coloque o controle de login em um asp: Panel e defina DefaultButton = "Login1 $ LoginButton" no painel

Ambas as abordagens funcionam bem com as páginas mestras.

2
adicionado

Based on your good answers, made a custom control that
enables a Page to have several default buttons based on which panel which is in focus.
It overrides Panel's OnLoad method and DefaultButton property.

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);
    }

    /// 
/// 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". ///
 
    /// 
    /// 
    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;
        }
    }      
}
1
adicionado

Uma solução é fornecida incorporando o controle de login dentro do controle do painel e configurando o defaultbutton do painel para o Parent $ ID do botão dentro do Login control work. Existe o código:




<table>
...
<tr>
<td></td>
</tr>
</table>



1
adicionado
Este é o caminho mais rápido, funciona !!
adicionado o autor Emanuel Pirovano, fonte

Para adicionar mais detalhes e instruções às postagens acima, veja um passo a passo:

Na marcação de qualquer página que carregue seu controle de login, você precisa atualizar o html em dois lugares.

Primeiro, na tag de formulário da página, você precisa definir o botão padrão. Veja abaixo como eu inventei o nome.

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

(Nomenclatura: a parte ucLogin antes do cifrão precisa ser o ID do seu controle de login, conforme declarado mais abaixo em sua página. A parte btnSubmit precisa ser o ID do botão, conforme é nomeado no html do controle de login)

Em seguida, você precisa incluir a declaração do seu controle de login em um painel e definir a propriedade DefaultButton, também:

<!-- Login Control - use a panel so we can set the default button -->
                         
                                                         

Isso deve bastar para você.

1
adicionado