2012-07-10 12 views
8

Oto sytuacja:reset stan odzyskiwania hasła

Mam PasswordRecovery ASP.NET (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.passwordrecovery.aspx) kontroli używanego na mojej stronie logowania.

Kiedy klikam na "Odzyskać link", pytam mnie o moją nazwę użytkownika, wpisuję ją, klikam przycisk "Wyślij moje hasło", powiadamia mnie, że wysłano e-mail, a następnie mogę kliknąć "wstecz" link, aby wrócić do kontroli logowania i kontynuować.

Mój problem: Jeśli kliknę ponownie na "Odzyskać link", kontrola utknie w swoim ostatnim stanie, który jest stanem udanym lub awaryjnym. Jeśli utknie w pomyślnym stanie, użytkownik nie będzie mógł wprowadzić żadnej nazwy użytkownika. Wyświetlana jest tylko ostatnia pomyślna wiadomość, bez możliwości powtórzenia tej samej procedury, co poprzednio.

Chciałbym zresetować kontrolę PasswordRecovery do jej stanu początkowego, aby użytkownik mógł wykonać kolejną operację odzyskiwania hasła bez konieczności odświeżania bieżącej strony (hit F5).

Grałem trochę z widzem + niszcz/odtwarzaj kontrolę, ale bez powodzenia.

Ktoś miał ten problem wcześniej?

Z góry dzięki!

+0

więc zdefiniować zdarzenie na kliknięcie przycisku. –

+0

Dzięki, ale to nie pomaga. Pytam, jak zresetować stan kontroli, a nie jak obsługiwać kliknięcie przycisku. –

Odpowiedz

6

Potwierdziłem, że nie ma czystej drogi do zrobienia tego (poprzez ILSpy), zobacz poniższy przykład nieco brudny sposób. Zasadniczo używamy odbicia, aby uzyskać właściwość CurrentView, która jest właściwością wewnętrzną, następnie ustawiamy bieżący widok kontrolki PasswordReset na jeden z trzech możliwych stanów: Nazwa użytkownika (0), Pytanie (1) lub Sukces (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> 

Code Behind

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

Dziękuję Piotrowi za twoje wysiłki, działa idealnie! –

+0

Świetne, dzięki. – Brissles

Powiązane problemy