1

この質問へのフォローアップとして、TempData に何が起こっているのか疑問に思っています。

シナリオ 1:

  • ユーザーのログイン
  • ユーザーがメールアドレスを提供
  • ユーザーは検証コードが記載された電子メールを受け取ります
  • ユーザーが検証 URL をクリックする
  • ユーザーが検証されます
  • Validate アクションで設定された TempData を介して成功メッセージが表示されます。

シナリオ 2:

  • ユーザーのログイン
  • ユーザーがメールアドレスを提供
  • ユーザーのログアウト/タイムアウト
  • ユーザーは検証コードが記載された電子メールを受け取ります
  • ユーザーが検証 URL をクリックする
  • ユーザーが検証されます
  • Validate アクションで設定された TempData を介して成功メッセージが表示されない

現在、ユーザーがログインして検証する理由がわかりません。シナリオ 1 では、"Success" メッセージを TempData に入れ、RedirectToAction("Index") を返します。インデックス アクションには AuthorizeAttribute があります。ログインしていない場合は、ログイン画面 (別のコントローラー) にリダイレクトされます。

ログイン画面にメッセージを表示したいのですが、このシナリオでは TempData がクリアされているように見えます。TempData ライフサイクルを誤解していますか? 同じコントローラ内のリクエストにのみ適用されますか?

4

2 に答える 2

6

問題は、ユーザーがログインしていない場合、AuthorizeAttribute がサイクルに別のリダイレクトを導入していることです。ユーザーを別のアクションにリダイレクトし、ユーザーがログインしていない場合、AuthorizeAttribute はユーザーをログイン ページにリダイレクトします。TempData は 1 回のリクエスト サイクルでしか存在しないため、追加のリダイレクト (リクエスト) によってデータが空になり、ログイン ページで使用できなくなります。

セッションへの TempData フロントエンドではなく、セッションに直接配置することを検討することもできます。セッションが存続している限り、それはまだそこにあるはずです。

于 2010-02-03T17:57:11.550 に答える
3

[Authorize]をクリアする追加のリダイレクトを導入しますTempData(Tvanfosson が詳細を説明しています)。したがって、これを機能させるには、リダイレクト先のメソッドでフラグを使用できます。たとえば、

return RedirectToAction("Confirm", new { status = "Success!" });

(次のルートとアクション メソッドが宣言されていると仮定します:)

routes.MapRoute("Confirmation",
    "Account/Confirm/{status}", 
    new { controller = "Account", action = "Confirm", status = "" });

public ActionResult Confirm(string status)
{
    return View(status);
}
于 2010-02-03T18:04:07.773 に答える