タイトルが悪くてすみません。
パスワードの回復ページを作成しようとしています。モデル情報に応じて、複数の状態を持つ 1 つのページとしてすべてを行うつもりでした (おそらく、これは良い方法ではありません)。
回復には4つのステップがあります
- ユーザーが入力した電子メールを検証する
- ユーザーが入力した最初の秘密の質問への回答を検証する
- 2 番目のセキュリティの質問に対してユーザーが入力した回答を検証する
パスワードをリセットするためのリンクが記載された電子メールが送信されたことを示すメッセージを表示します。
[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 であるため、メールの質問に戻ります。
このようなセットアップを作成する適切な方法は何ですか? または、モデルに常にビューと電子メールを持たせるにはどうすればよいですか?