2012-07-10 14 views
8

Ecco la situazione:ripristino dello stato di recupero password

Ho un controllo ASP.NET PasswordRecovery (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.passwordrecovery.aspx) utilizzato sulla mia pagina di login.

Quando faccio clic sul link "Recupera", mi chiede il mio nome utente, lo inserisco, faccio clic sul pulsante "Invia password", mi informa che è stata inviata un'e-mail e quindi posso fare clic sul link "indietro" per tornare al controllo di accesso e procedere.

Il mio problema è: se faccio nuovamente clic su "Ripristina collegamento", il controllo è bloccato nel suo ultimo stato, che è lo stato riuscito o lo stato non riuscito. Se bloccato nello stato riuscito, l'utente non sarà in grado di immettere alcun nome utente. Verrà visualizzato solo l'ultimo messaggio riuscito, senza poter ripetere la stessa procedura di prima.

Vorrei ripristinare il controllo PasswordRecovery al suo stato iniziale, in modo che l'utente possa eseguire un'altra operazione di ripristino della password senza dover aggiornare la pagina corrente (premere F5).

Ho giocato un po 'con il viewstate + per distruggere/ricreare il controllo ma senza alcun successo.

Qualcuno ha avuto questo problema prima?

Grazie in anticipo!

+0

Quindi definire un evento per fare clic sul pulsante. –

+0

Grazie, ma questo non aiuta. Sto chiedendo come ripristinare lo stato del controllo, non come gestire un clic del pulsante. –

risposta

6

Ho convalidato che non esiste un modo pulito per farlo (tramite ILSpy), vedere l'esempio di seguito per il modo leggermente sporco. Fondamentalmente usiamo il reflection per ottenere la proprietà CurrentView, che è una proprietà interna, quindi impostiamo la vista corrente del controllo PasswordReset su uno dei tre possibili stati: Username (0), Question (1) o Success (2).

Designer

<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> 

Codice Dietro

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

Grazie Peter per i tuoi sforzi, funziona perfettamente! –

+0

Brillante, grazie. – Brissles

Problemi correlati