web-dev-qa-db-ja.com

ASP.NET MVCでのTempdataの使用-ベストプラクティス

ASP.NET MVC 3を使用してWebアプリケーションを構築しています。

私がやろうとしているのは2つのコントローラー間で値を渡すことですが、これを行うには多くの方法がありますが、このためにTempDataを使用することに特に興味があります。

public ActionResult Action1()
{
    string someMessage;
    Test obj = SomeOperation();
    if(obj.Valid)
    {
        someMessage = obj.UserName;
    }
    else
    {
        someMessage = obj.ModeratorName;
    }

    TempData["message"] = someMessage;

    return RedirectToAction("Index");
}

public ActionResult Index()
{
    ViewBag.Message = TempData["message"]

    return View();
}

ここでTempDataの使用は正しいですか?プログラミングのベストプラクティスでは、TempDataを使用するこの正しい方法を意味します。

どのような場合にTempDataを使用する必要がありますか?

注:次のリンクを使用しました

ありがとう

65
Yasser

TempDataは、次のリクエストにのみ必要なデータをダンプできるバケットです。つまり、TempDataに入れたものはすべて、次の要求が完了した後に破棄されます。これは、フォーム検証エラーなどの1回限りのメッセージに役立ちます。ここで注意する重要なことは、これがセッション内の次のリクエストに適用されるため、リクエストが別のブラウザウィンドウまたはタブで発生する可能性があることです。

特定の質問に答えるために:それを使用する正しい方法はありません。それはすべて使いやすさと便利さ次第です。それが機能し、理にかなっており、他の人がそれを比較的簡単に理解しているなら、それは良いことです。特定のケースでは、この方法でパラメーターを渡すことは問題ありませんが、それを行う必要があるのは奇妙です(コードの匂い?)。リソース(リソースの場合)またはデータベース(永続的な値の場合)にこのような値を保持したいです。使用方法から見ると、ページタイトルに使用しているため、リソースのように見えます。

お役に立てれば。

69
Display Name

MVC 3以降、TempDataの永続性の動作が変更され、TempDataの値は、次のリクエストだけでなく、読み取られるまで保持されることに注意してください。

TempDataの値は、読み取られるか、セッションがタイムアウトするまで保持されます。このようにTempDataを永続化すると、TempDataの値は単一の要求を超えて利用できるため、リダイレクトなどのシナリオが可能になります。 https://msdn.Microsoft.com/en-in/library/dd394711%28v=vs.100%29.aspx

54
Yogi

TempDataの永続性に注意してください。少し注意が必要です。たとえば、現在のリクエスト内のTempDataを単に読み取る場合でも、TempDataは削除され、その結果、次のリクエストにはTempDataがありません。代わりに、Peekメソッドを使用できます。このクールな記事を読むことをお勧めします。

MVC Tempdata、PeekおよびKeep混乱

16
Mojtaba