8

これが状況です:

ログインページでASP.NETPasswordRecovery(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.passwordrecovery.aspx)コントロールを使用しています。

「回復リンク」をクリックすると、ユーザー名の入力を求められ、入力して「パスワードを送信」ボタンをクリックすると、メールが送信されたことが通知され、「戻る」リンクをクリックできます。ログインコントロールに戻り、続行します。

私の問題は次のとおりです。[回復リンク]をもう一度クリックすると、コントロールは最後の状態、つまり成功状態または失敗状態でスタックします。成功状態でスタックした場合、ユーザーはユーザー名を入力できなくなります。最後に成功したメッセージのみが表示され、以前と同じ手順を繰り返すことはできません。

PasswordRecoveryコントロールを初期状態にリセットしたいので、ユーザーは現在のページを更新せずに別のパスワード回復操作を実行できます(F5キーを押します)。

ビューステート+コントロールの破棄/再作成で少し遊んだのですが、成功しませんでした。

誰かが以前にこの問題を抱えていましたか?

前もって感謝します!

4

1 に答える 1

6

(ILSpyを介して)これを行うためのクリーンな方法がないことを検証しました。少し汚れた方法については、以下の例を参照してください。基本的に、リフレクションを使用してCurrentView内部プロパティであるプロパティを取得し、PasswordResetコントロールの現在のビューを、ユーザー名(0)、質問(1)、または成功(2)の3つの可能な状態のいずれかに設定します。

デザイナー

<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);
}
于 2012-07-11T18:01:01.103 に答える