0

タイトルが悪くてすみません。

パスワードの回復ページを作成しようとしています。モデル情報に応じて、複数の状態を持つ 1 つのページとしてすべてを行うつもりでした (おそらく、これは良い方法ではありません)。

回復には4つのステップがあります

  1. ユーザーが入力した電子メールを検証する
  2. ユーザーが入力した最初の秘密の質問への回答を検証する
  3. 2 番目のセキュリティの質問に対してユーザーが入力した回答を検証する
  4. パスワードをリセットするためのリンクが記載された電子メールが送信されたことを示すメッセージを表示します。

    [AllowAnonymous]
    public ActionResult RecoverPassword()
    {
        return View(new RecoverPassword());
    }
    [AllowAnonymous]
    [HttpPost]
    public ActionResult RecoverPassword(RecoverPassword model)
    {
        var user = new Identity("", "");
        ASResponse<string> asr;
        switch (model.View)
        {
            case "One":
                try
                {
                    asr = Services.ValidateSecurityQuestionOne(user.Token, model.Email, model.Answer);
                    model.View = "Two";
                    model.Question = "Your Other Favorite Color"; //asr.Payload;
                    model.Answer = string.Empty;
                }
                catch (Exception)
                {
                    ModelState.AddModelError("Question", "Incorrect Answer");
                }
                break;
            case "Two":
                try
                {
                    asr = Services.ValidateSecurityQuestionTwo(user.Token, model.Email, model.Answer);
                    model.View = "Email";
                    model.Question = string.Empty;
                }
                catch (Exception)
                {
                    ModelState.AddModelError("Question", "Incorrect Answer");
                }
    
                break;
            case "Email": break;
            default:
                if (!string.IsNullOrEmpty(model.Email))
                {
                    try
                    {
                        asr = Services.ValidateEmail(user.Token, model.Email);
                        model.View = "One";
                        model.Question = asr.Payload;
                    }
                    catch (Exception)
                    {
                        ModelState.AddModelError("Email", "Invalid Email");
                    }
    
                }
                break;
        }
    
        return View(model);
    }
    
    
    <div>
    <div>Retrieve your password</div>
    @{
    
    using (@Html.BeginForm())
    {
    
    @Html.HiddenFor(m => m.View)
    
    switch (Model.View)
    {
        case "One":
        case "Two":
            @Html.HiddenFor(m => m.Email)
            <h3>@Model.Question</h3>
            @Html.TextBoxFor(m => m.Answer)
            <br/>
            <input type="submit" value="Next" />
            break;
        case "Email":
            <h3>Your email is on its way!</h3>
            break;
        default:
    
            <h3>Please enter your Account Email Address</h3>
            @Html.TextBoxFor(m => m.Email)
            <br/>
            <input type="submit" value="Next" />
            break;
    }
    }    
    
    }
    
    </div>
    

上記で、メールを入力すると、最初の質問が表示されますが、その回答を送信すると、model.View が null であるため、メールの質問に戻ります。

このようなセットアップを作成する適切な方法は何ですか? または、モデルに常にビューと電子メールを持たせるにはどうすればよいですか?

4

1 に答える 1

0

ビューで @Html.HiddenFor(m => m.View) を削除し、次のように各スイッチ条件内に移動してみてください。

switch (Model.View)
{
    case "One":
        @Html.HiddenFor(m => m.Email)
        <h3>@Model.Question</h3>
        @Html.TextBoxFor(m => m.Answer)
        @Html.HiddenFor(m => m.View)
        <br/>
        <input type="submit" value="Next" />
        break;
    case "Two":
        @Html.HiddenFor(m => m.Email)
        <h3>@Model.Question</h3>
        @Html.TextBoxFor(m => m.Answer)
        @Html.HiddenFor(m => m.View)
        <br/>
        <input type="submit" value="Next" />
        break;
    case "Email":
        <h3>Your email is on its way!</h3>
        break;
    default:

        <h3>Please enter your Account Email Address</h3>
        @Html.TextBoxFor(m => m.Email)
        <br/>
        <input type="submit" value="Next" />
        break;
}
于 2013-10-22T23:33:27.300 に答える