16

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>

セッションは、あらゆる情報を保持するもう 1 つの非常に便利なオブジェクトです。

たとえば、ユーザーがシステムにログインしたときに、ユーザーの承認レベルを保持したいとします。

// GetUserAuthorizationLevel - some method that returns int value for user authorization level.

Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);

この情報は、ユーザー セッションがアクティブである限り、Session に保存されます。これは、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()); 
   }
4

4 に答える 4

17

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"]

温度データ

間に 1 つまたは複数の HTTP 要求があるかどうかに関係なく、保存するものはすべて、TempData読み取るまで tempdata に残ります。

行動

public ActionResult Index()
{
    TempData["SomeName"] = "Hello";
    return RedirectToAction("Details");
}


public ActionResult Details()
{
    var someName = TempData["SomeName"];
}
于 2013-03-04T14:41:28.753 に答える
3

温度データ

は非常に短期間のインスタンスであることを意図しており、現在のリクエストと後続のリクエストの間のみ使用する必要があります。TempData はこのように機能するため、次のリクエストがどうなるかを確実に知る必要があり、これを保証できるのは別のビューへのリダイレクトだけです。したがって、TempData の使用が確実に機能する唯一のシナリオは、リダイレクトする場合です。これは、リダイレクトが現在のリクエストを強制終了し (そして HTTP ステータス コード 302 Object Moved をクライアントに送信し)、リダイレクトされたビューを提供するためにサーバー上に新しいリクエストを作成するためです。前の HomeController コード サンプルを振り返ってみると、次の要求元が保証されないため、TempData オブジェクトが予想とは異なる結果を生成する可能性があることがわかります。たとえば、次のリクエストは、まったく別のマシンおよびブラウザ インスタンスから発信される可能性があります。

ビューデータ

ViewData は、データを入れるディクショナリ オブジェクトであり、ビューで使用できるようになります。ViewData は ViewDataDictionary クラスの派生クラスであるため、使い慣れた「キー/値」構文でアクセスできます。

ビューバッグ

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();
    }
}
于 2013-03-04T14:35:38.850 に答える
0
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 つのポストパックでコード内を何度でも読み取ることができます。ページのレンダリングが発生すると、再度 postpack (リクエスト) を実行すると、tempdata の値が NULL になります。

あなたは何度もリクエストしていますが、tempdata 値はまだ生きています --> この場合、リクエストの数は temp データ値を読み取るべきではありません。

于 2015-08-20T10:02:52.370 に答える