2012-07-10 25 views
8

Esta es la situación:Restablecer el estado de recuperación de contraseña

tengo un control ASP.NET PasswordRecovery (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.passwordrecovery.aspx) utilizado en mi página de inicio de sesión.

Cuando hago clic en "Recuperar enlace", me pide mi nombre de usuario, lo ingreso, hago clic en el botón "Enviar mi contraseña", me notifica que se ha enviado un correo electrónico y puedo hacer clic en el enlace "volver" para regresar al control de inicio de sesión y continuar.

Mi problema es: si vuelvo a hacer clic en "Recuperar enlace", el control queda bloqueado en su último estado, que es el estado correcto o el estado fallido. Si se bloquea en el estado exitoso, el usuario no podrá ingresar ningún nombre de usuario. Solo se mostrará el último mensaje exitoso, sin poder repetir el mismo procedimiento que antes.

Me gustaría restablecer el control PasswordRecovery a su estado inicial, por lo que el usuario podría hacer otra operación de recuperación de contraseña sin tener que actualizar la página actual (presionar F5).

Jugué un poco con viewstate + destruir/recrear el control pero sin éxito.

¿Alguien ha tenido este problema antes?

¡Gracias de antemano!

+0

Así define un evento de clic en el botón. –

+0

Gracias, pero eso no ayuda. Estoy preguntando cómo restablecer el estado de control, no cómo manejar un clic de botón. –

Respuesta

6

Validé que no hay una manera clara de hacerlo (a través de ILSpy), vea el ejemplo a continuación por el camino ligeramente sucio. Básicamente usamos la reflexión para obtener la propiedad CurrentView, que es una propiedad interna, luego establecemos la vista actual del control PasswordReset en uno de los tres estados posibles: Nombre de usuario (0), Pregunta (1) o Éxito (2).

Diseñador

<form id="form1" runat="server"> 
<div> 
    <asp:PasswordRecovery ID="pwr" runat="server"></asp:PasswordRecovery> 
</div> 
<span>Set Recover State: </span> 
<asp:RadioButtonList ID="rblChangeState" runat="server" AutoPostBack="True" 
    onselectedindexchanged="rblChangeState_SelectedIndexChanged"> 
    <asp:ListItem Text="Username" Value="0" /> 
    <asp:ListItem Text="Question" Value="1" /> 
    <asp:ListItem Text="Success" Value="2" /> 
</asp:RadioButtonList> 
</form> 

Código Detrás

protected void rblChangeState_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Type t = pwr.GetType(); 
    PropertyInfo viewSetter = t.GetProperty("CurrentView", BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance); 
    viewSetter.SetValue(pwr, Convert.ToInt32(rblChangeState.SelectedValue), null); 
} 
+0

Gracias Peter por tu esfuerzo, ¡funciona a la perfección! –

+0

Brillante, gracias. – Brissles

Cuestiones relacionadas