2012-07-10 93 views
8

这里的情况:重置密码恢复状态

我有我的登录页面上使用ASP.NET PasswordRecovery(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.passwordrecovery.aspx)控制。

当我点击“恢复链接”时,它会询问我的用户名,我输入它,点击“发送我的密码”按钮,它会通知我一封电子邮件已发送,然后点击“返回”链接返回登录控制并继续。

我的问题是:如果我再次单击“恢复链接”,控件会停留在最后一个状态,即成功状态或失败状态。如果卡在成功状态,用户将无法输入任何用户名。只有最后一条成功的消息才会显示,而不能重复与之前相同的过程。

我想重置密码恢复控制到它的初始状态,所以用户可以做另一个密码恢复操作,而不必刷新当前页面(按F5)。

我玩了一下viewstate + destroy /重新创建控件,但没有任何成功。

以前有人有过这个问题吗?

在此先感谢!

+0

所以定义事件点击按钮。 – 2012-07-10 19:00:13

+0

谢谢,但这没有帮助。我在问如何重置控制状态,而不是如何处理按钮点击。 – 2012-07-10 19:20:26

回答

6

我验证了没有干净的方法来做到这一点(通过ILSpy),请参阅下面的例子,以稍微肮脏的方式。基本上我们使用反射来获得CurrentView属性,这是一个内部属性,然后我们将PasswordReset控件的当前视图设置为以下三种状态之一:用户名(0),问题(1)或成功(2)。

设计师

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

代码隐藏

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

感谢彼得的努力,它完美的作品! – 2012-07-12 17:28:12

+0

辉煌,谢谢。 – Brissles 2013-11-21 16:12:20