ViewDataおよびViewBagを使用すると、コントローラーから渡されたビュー内の任意のデータにアクセスできます。
これら2つの主な違いは、データへのアクセス方法です。 ViewBagでは、文字列をキーとして使用してデータにアクセスしています-ViewBag [“ numbers "] ViewDataでは、プロパティを使用してデータにアクセスしています-ViewData.numbers。
ViewDataの例
コントローラ
var Numbers = new List<int> { 1, 2, 3 };
ViewData["numbers"] = Numbers;
見る
<ul>
@foreach (var number in (List<int>)ViewData["numbers"])
{
<li>@number</li>
}
</ul>
ViewBagの例
コントローラ
var Numbers = new List<int> { 1, 2, 3 };
ViewBag.numbers = Numbers;
見る
<ul>
@foreach (var number in ViewBag.numbers)
{
<li>@number</li>
}
</ul>
Sessionは、情報を保持するもう1つの非常に便利なオブジェクトです。
たとえば、ユーザーがシステムにログインしたときに、彼の認証レベルを保持したいとします。
// GetUserAuthorizationLevel - some method that returns int value for user authorization level.
Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);
この情報は、ユーザーセッションがアクティブである限り、セッションに保存されます。これは、Web.configファイルで変更できます。
<system.web>
<sessionState mode="InProc" timeout="30"/>
それで、アクション内のコントローラーで:
public ActionResult LevelAccess()
{
if (Session["AuthorizationLevel"].Equals(1))
{
return View("Level1");
}
if (Session["AuthorizationLevel"].Equals(2))
{
return View("Level2");
}
return View("AccessDenied");
}
TempDataはViewDataおよびViewBagに非常に似ていますが、1つのリクエストのデータのみが含まれます。
コントローラ
//新しいクライアントを追加するメソッドを作成しました。
TempData["ClientAdded"] = "Client has been added";
見る
@if (TempData["ClientAdded"] != null)
{
<h3>@TempData["ClientAdded"] </h3>
}
TempDataは、ViewからControllerに情報を渡したい場合に役立ちます。たとえば、ビューが要求されたときの時間を保持したいとします。
見る
@{
TempData["DateOfViewWasAccessed"] = DateTime.Now;
}
コントローラ
if (TempData["DateOfViewWasAccessed"] != null)
{
DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString());
}
ViewBag、ViewData、TempData、Session-それらをいつどのように使用するか?
それを避けなさい。可能な場合はビューモデルを使用してください。
動的プロパティを使用すると、コンパイルエラーが発生しないためです。プロパティ名を偶然または目的で変更し、すべての使用法を更新するのを忘れるのは本当に簡単です。
ViewModelを使用する場合、その問題は発生しません。また、ビューモデルは、MVCの「M」(つまり、ビジネスエンティティ)を適応させる責任をコントローラーとビューからViewModelに移すため、明確な責任を持ってよりクリーンなコードを取得できます。
アクション
public ActionResult Index()
{
ViewBag.SomeProperty = "Hello";
return View();
}
表示(かみそりの構文)
@ViewBag.SomeProperty
それを回避します。可能な場合はビューモデルを使用してください。 ViewBagと同じ理由。
アクション
public ActionResult Index()
{
ViewData["SomeProperty"] = "Hello";
return View();
}
表示(かみそりの構文):
@ViewData["SomeProperty"]
TempData
に保存したものはすべて、その間に1つまたは複数のHTTPリクエストがあるかどうかに関係なく、それを読み取るまでtempdataに残ります。
アクション
public ActionResult Index()
{
TempData["SomeName"] = "Hello";
return RedirectToAction("Details");
}
public ActionResult Details()
{
var someName = TempData["SomeName"];
}
は非常に短期間のインスタンスであることが意図されており、現在および後続のリクエストでのみ使用してください。 TempDataはこのように機能するため、次のリクエストがどうなるかを確実に知る必要があり、別のビューへのリダイレクトがこれを保証できる唯一の時間です。したがって、TempDataを確実に使用できる唯一のシナリオは、リダイレクトする場合です。これは、リダイレクトによって現在のリクエストが強制終了され(クライアントにHTTPステータスコード302 Object Movedが送信される)、リダイレクトされたビューを提供するためにサーバー上に新しいリクエストが作成されるためです。前のHomeControllerコードサンプルを振り返ると、次のリクエストOriginが保証されないため、TempDataオブジェクトが予想とは異なる結果をもたらす可能性があります。たとえば、次のリクエストは、まったく異なるマシンとブラウザインスタンスから発生する可能性があります。
ViewData
ViewDataは、データを入れたディクショナリオブジェクトで、ビューで使用できるようになります。 ViewDataはViewDataDictionaryクラスの派生クラスなので、使い慣れた「キー/値」構文でアクセスできます。
ViewBag
ViewBagオブジェクトは、ViewDataオブジェクトのラッパーであり、ViewBagの動的プロパティを作成できます。
public class HomeController : Controller
{
// ViewBag & ViewData sample
public ActionResult Index()
{
var featuredProduct = new Product
{
Name = "Special Cupcake Assortment!",
Description = "Delectable Vanilla and chocolate cupcakes",
CreationDate = DateTime.Today,
ExpirationDate = DateTime.Today.AddDays(7),
ImageName = "cupcakes.jpg",
Price = 5.99M,
QtyOnHand = 12
};
ViewData["FeaturedProduct"] = featuredProduct;
ViewBag.Product = featuredProduct;
TempData["FeaturedProduct"] = featuredProduct;
return View();
}
}
namespace TempData.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
TempData["hello"] = "test"; // still alive
return RedirectToAction("About");
}
public ActionResult About()
{
//ViewBag.Message = "Your application description page.";
var sonename = TempData["hello"]; // still alive (second time)
return RedirectToAction("Contact");
}
public ActionResult Contact()
{
var scondtime = TempData["hello"]; // still alive(third time)
return View();
}
public ActionResult afterpagerender()
{
var scondtime = TempData["hello"];//now temp data value becomes null
return View();
}
}
}
上記の会話では、誰にとっても混乱はほとんどありません。上記のコードを見ると、tempdataはviewdataの概念に似ていますが、他のビューをリダイレクトすることもできます。これが最初のポイントです。
2番目のポイント:読むまで価値を維持すると言っている人はほとんどいません。そうではありません。実際、ページをレンダリングする前に、コード内の何回でも1つのポストパックで読み取ることができます。ページレンダリングが発生した後、再度ポストパック(要求)を実行すると、tempdata値はNULLになります。
あなたが非常に多くの時間を要求している場合でも、tempdata値はまだ生きています->この場合、要求の数はtempデータ値を読み取るべきではありません。
簡単な言葉で:
ViewBagは、動的(動的:同じオブジェクト上の異なるプログラムによって複数の値を割り当てる機能)オブジェクトであり、コントローラーからビューにデータを送信するために使用されます。コントローラのアクションからビューにジャンプするときに使用できます。ただし、ビュー(viewbagオブジェクト内)で取得した値は、他のビュー/コントローラー/ jsページなどで複製することはできません。意味:コントローラー->ビュー(可能)。現在、この値は次のビュー/コントローラーに送信できません。意味Controller-> View-> View/controller /一部のjsファイル(不可能)。この値を運ぶには、他の変数を定義し、それにviewbag値を格納して、パラメーターとして送信する必要があります。
Tempdataはviewbagとは大きく異なります。ビューとはまったく関係ありません。同じコントローラー内の1つのアクション(メソッド)から別のアクションにデータを送信するときに使用されます。これが、あるアクションから別のアクションにtempdata値を送信するときは常にRedirectToActionを使用する理由です。 tempdataの値は、コントローラーからveiwに送信するときに保持されません(そうすることを意図していないため)。
ViewDataはviewbagに似ていますが、ディクショナリオブジェクトです。 ViewDataは型キャストが必要な場合がありますが、viewbagは必要ありません。それは、ユーザーがどのユーザーを使用するかによって異なります。