Enviar el botón de control de inicio de sesión cuando presiono Entrar

Tengo una página web ASP.NET con un control de inicio de sesión en ella. Cuando presiono Enter, el botón Iniciar sesión no se dispara; en su lugar, la página envía, sin hacer nada.

La solución estándar para esto que encontré en línea es encerrar el control de inicio de sesión en un Panel, luego establecer el botón predeterminado del Panel. Pero aparentemente eso no funciona tan bien si la página tiene una página maestra. Intenté configurar el botón predeterminado en el código con control .ID, control .ClientID y control .UniqueID, y en cada caso obtener:

El DefaultButton de panelName debe ser el ID de un control de tipo IButtonControl.

Estoy seguro de que hay una manera de hacer esto con JavaScript, pero realmente me gustaría hacerlo con el viejo y sencillo código C# si es posible. ¿Es posible?

22
No lo temo , pero me molesta que debería haber una forma de hacerlo en el código y no puedo entender cuál es.
agregado el autor Ryan Lundy, fuente
No temas el JavaScript en este caso. Le ahorrará mucho dolor de cabeza y tiempo.
agregado el autor StingyJack, fuente

9 Respuestas

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

Puede usar lo siguiente para hacer referencia al botón dentro de la plantilla de control de inicio de sesión:

DefaultButton="Login$LoginButton"

Básicamente, puede definir un DefaultButton no solo en el nivel de Formulario, sino también en el nivel de Panel individual, siempre que el foco esté dentro del panel, se usará el botón predeterminado para el panel si presiona "Enter"

33
agregado
¡Tu millón de vidas salvadas!
agregado el autor Sarawut Positwinyu, fuente
@MikeC. Solo quiero que sepas que es útil para mí: D
agregado el autor Sarawut Positwinyu, fuente
Solo un FYI para cualquier otra persona que use ImageButton ... tendrá que usar DefaultButton = "Login $ LoginImageButton".
agregado el autor Mike Cole, fuente
Eso funciona, pero por alguna razón no puedo hacerlo en código. Ni ID ni ClientID ni UniqueID producen el formato de ID correcto para la propiedad DefaultButton del Panel.
agregado el autor Ryan Lundy, fuente
Sí, lo intenté y no funcionó. FindControl realmente funciona (podría verlo en el depurador), pero por alguna razón, DefaultButton requiere un formato de ID especial.
agregado el autor Ryan Lundy, fuente
¿Has intentado algo como ésto? ((LoginForm.FindControl ("LoginButton")) como Botón) .UniqueID
agregado el autor Vassili Altynikov, fuente
Resulta que simplemente necesita usar el mismo valor en código subyacente: pnlLogin.DefaultButton = "Login1LoginButton";
agregado el autor Vassili Altynikov, fuente
Me olvidé por completo del DefaultButton en los paneles. Gracias por recordarme.
agregado el autor Rismo, fuente

¡Gran respuesta de Blend Master ! Esencialmente solo use Panel.DefaultButton, pero quiero aclarar la confusión acerca de qué exactamente necesita configurarlo. No es solo ".ID" o ".UniqueID": la documentación es un poco insuficiente en esto.

Debe establecerlo en UniqueID del botón, relativo a el identificador UniqueID del contenedor de nombres del Panel. Por ejemplo, si su panel UniqueID es "Body $ Content $ pnlLogin" y el UniqueID de su botón de inicio de sesión es "Body $ Content $ ucLogin $ btnLogin" (porque está dentro de un control llamado "ucLogin"), entonces debe configurar Panel.DefaultButton para "ucLogin $ btnLogin".

Puede resolver esto en el código de la siguiente manera. (No pude encontrar ningún método de biblioteca de clase para esto, pero avíseme si encuentra uno).

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
agregado
La respuesta de evgeny funcionó para mí, casi lo mismo que blend master pero con el signo de dólar incluido
agregado el autor Marbella Consulting, fuente

tienes que agregar algo como esto en la carga de la página ...

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

el cuadro de texto de la contraseña tiene un atributo onKeyPress agregado que forzará un doPostBack en el botón de enviar si se presiona la tecla "Enter". Esto simula hacer clic en el botón enviar.

4
agregado
Así es exactamente como lo hago
agregado el autor Andy Brudtkuhl, fuente

Parece que el botón de inicio de sesión se escupió como <input type = "button"> en lugar de <input type = "submit"> . Siempre puedes crear una plantilla en el LoginControl y agregar el botón de enviar, ¡deshazte de la horrible etiqueta predeterminada al mismo tiempo!

Si tiene que usar Javascript para arreglar esto, ¡algo está muy mal! (pero entonces parece que lo sabes)

2
agregado
Entonces, agregar Command = "Login" debería hacer el truco, ¿no?
agregado el autor roryf, fuente
Para aclarar: agregue ese atributo a su asp: control de botón que es el botón de inicio de sesión
agregado el autor roryf, fuente
Irónicamente, el botón de inicio de sesión ya está templado.
agregado el autor Ryan Lundy, fuente

Yo, encontré esta solución en la red, funcionó para mí.

 
 
 
 ...
 
 
 
 
2
agregado

Asumiendo Login1 es la ID de su control de inicio de sesión.

Para 'ingresar' en cualquier lugar de la página para enviar, agregue a init en su código subyacente:

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

Para que 'enter' solo se envíe cuando esté dentro del control de inicio de sesión, ajuste el control de inicio de sesión en un asp: Panel y configure DefaultButton = "Login1 $ LoginButton" en el panel

Ambos enfoques funcionan bien con páginas maestras.

2
agregado

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
agregado

Se proporciona una solución insertando el control de inicio de sesión dentro del control del panel y estableciendo el botón predeterminado del panel en el Parent $ ID del botón dentro de Control de inicio de sesión. Ahí está el código:




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



1
agregado
¡Esta es la manera más rápida, funciona!
agregado el autor Emanuel Pirovano, fuente

Para agregar un poco más de detalle e instrucciones a las publicaciones anteriores, he aquí un tutorial:

En el marcado de cualquier página que cargue su control de inicio de sesión, debe actualizar el html en dos lugares.

Primero, en la etiqueta de formulario de la página, debe configurar el botón predeterminado. Vea a continuación cómo se me ocurrió el nombre.

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

(Denominación: La parte ucLogin antes del signo de dólar debe ser la ID de su control de inicio de sesión, como se declara más abajo en su página. La parte btnSubmit debe ser la ID del botón como se nombra en el html del control de inicio de sesión)

A continuación, debe ajustar la declaración de su control de inicio de sesión en un panel y establecer su propiedad DefaultButton también:

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

Eso debería hacerlo por ti.

1
agregado