[ASP.NET] Asignar el DefaultButton de un webcontrol Login

Como asignar un DefaultButton para un formulario de Login que se encuentra en un layout con MasterPages y el común denominador de un formulario de login que siempre lo podemos encontrar del lado derecho o arriba a la izquierda.  
Esta fue la pregunta desde los foros de MSDN de ASP.NET que si bien no es fácil asignar esta propiedad cuando el botón objetivo se encuentra dentro de un template de un webcontrol, se puede hacer y aqui dejo para ”ayuda-memoria” y referencia.

Si bien lo podemos hacerlo mediante javascript (algo similar ya lo comente por aquí) la idea en el presente articulo es aplicar la propiedad DefaultButton que lo tiene los controles Form (HtmlForm) y Panel.

Particularmente por el layout presentado era que MasterPage que en una pagina con un formulario, cuando se quería dar login y desde el texbox de password al “presionar el enter” no era el evento por default el botón de login sino otra parte de la pagina. Como sabrán esto depende de como esta “armada” ya que en HTML el tab de los controles es en orden que están en el HTML (no del orden visible). Por eso que tenemos en ASP.NET la posibilidad de asignarlo este comportamiento tan natural a un Form (HtmlForm) o Panel. Incluso si estas familiarizado con los ValidationGroups de los controles esto viene a ayudarnos una vez mas a tener “porciones o grupos de formularios independientes” en nuestros webforms.
NOTA: Solo se admite para esta propiedad controles Button e ImageButton.

 

Como asignamos la propiedad DefaultButton de un Panel con el botón de un webcontrol Login?

Aquí tienes dos opciones para asignar esta propiedad por código y mediante el uso de identificador que renderiza en el cliente (sin código)
Si bien podemos convertir a template el webcontrol para manipular los controles internos de su template, el botón de login sigue dentro y no podemos obtener directamente su UniqueID (pero si lo podemos hacer por codigo)

SNAGHTML48a04527

Y vemos realmente el ID del botón:

SNAGHTML48a2b180
Pero estas dos opciones que comentare no es necesario convertir a template el webcontrol.

OPCION 1: Por código asignamos el DefaultButton al panel (obteniendo el botón de login mediante FindControl)

Aquí la idea es por código obtener el UniqueID (identificador único jerárquico) del botón, si necesidad de convertirlo a template.

Si tenemos por ejemplo el siguiente webcontrol login dentro de un panel:

<asp:Panel ID="pnlLogin" runat="server">      
Aqui otro boton de login<br/>
<asp:Login ID="Login1" runat="server"
onauthenticate="Login1_Authenticate"
onloggingin="Login1_LoggingIn">
</asp:Login>
</asp:Panel>

Y desde el codebehind asignamos la propiedad DefaultButton del Panel.

Para eso obtenemos el botón dentro del webcontrol Login (con FindControl) y lo asignamos el UniqueID del mismo como propiedad del DefaultButton del panel

protected void Page_Load(object sender, EventArgs e)
{
pnlLogin.DefaultButton = ((Button)Login1.FindControl("LoginButton")).UniqueID;
}

Vemos que es necesario el UniqueID y no el ClientID, textual de MSDN:


(…)Esta propiedad se diferencia de la propiedad de ID , en que la propiedad de UniqueID incluye el identificador del contenedor de nomenclatura del control de servidor. Este identificador se genera automáticamente cuando se procesa una solicitud de página.(…)

SNAGHTML48b2bfb4

 

OPCION 2: Vía el nombre del webcontrol padre (en modo diseño, "Login1$LoginButton")

Aquí nos ayudamos de nombre del que obtiene el botón que se encuentra dentro del webcontrol login

SNAGHTML48812bec

Como vemos en la propiedad name se concatenan con $ los nombres de los controles padres hasta el control. Esto es la jerarquía del control (útil para controles con el mismo nombre) 
No es necesaria toda la ruta solamente el control contenedor padre (ya que el panel se encuentra en la misma ubicación y como padre del webcontrol login) para asignar a la propiedad…

Es decir nos quedaría así:

DefaultButton="Login1$LoginButton"

<asp:Panel ID="pnlLogin" runat="server" 
DefaultButton="Login1$LoginButton">
Aqui otro boton de login<br/>
<asp:Login ID="Login1" runat="server" ClientIDMode="Static"
onauthenticate="Login1_Authenticate"
onloggingin="Login1_LoggingIn">
</asp:Login>
</asp:Panel>

Y así ya estaría funcionando el DefaultButton.

NOTA (por si se confunde el id con el name): Para esta opción 2 utilizamos el NamingContainer que se renderiza en el name que justamente no influye el modo que lo utilicemos a la propiedad ClientIDMode porque aquí esta dentro de un control Login y siempre lo estará, pero lo único que cambia es el id del lado del cliente (por eso es la propiedad ClientIDMode)

O sea el id de “cliente” cambia pero no el name cuando la propiedad es Static por ejemplo

SNAGHTML48a7f718

 

 

Otros enlaces que te pueden ayudar

 

Delicious tags : ,