情况如下:
我在登录页面上使用了一个ASP.NET PasswordRecovery(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.passwordrecovery.aspx)控件。
当我点击“恢复链接”时,它会询问我的用户名,我输入它,点击“发送我的密码”按钮,它通知我已发送电子邮件然后我可以点击“返回“链接返回登录控制并继续。
我的问题是:如果我再次单击“恢复链接”,控件将停留在它的最后状态,即成功状态或失败状态。如果卡在成功状态,用户将无法输入任何用户名。只显示最后一条成功的消息,而不能重复与以前相同的过程。
我想将PasswordRecovery控件重置为初始状态,这样用户无需刷新当前页面即可执行其他密码恢复操作(点击F5)。
我使用viewstate + destroy /重新创建控件但没有任何成功。
之前有人遇到过这个问题吗?
提前致谢!
答案 0 :(得分:6)
我验证了没有干净的方法(通过ILSpy),请参阅下面的示例,了解稍微脏的方法。基本上我们使用反射来获取CurrentView
属性,这是一个内部属性,然后我们将PasswordReset控件的当前视图设置为三种可能状态之一:Username(0),Question(1)或Success (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);
}