ViewDataとViewBagの違いは何ですか?


回答:


388

C#4.0動的機能を使用します。これはviewdataと同じ目標を達成するため、厳密に型指定されたビューモデルを使用することを避けてください(viewdataと同じ方法で回避する必要があります)。

つまり、基本的にはマジックストリングを置き換えます

ViewData["Foo"]

魔法のプロパティ

ViewBag.Foo

コンパイル時の安全性がない場合。

この概念をMVCに導入したことについて、マイクロソフトを非難し続けています。

プロパティの名前は大文字と小文字が区別されます。


11
マイクロソフトを非難する目的は何ですか?ビューデータがない場合、どのようにモデルからドロップダウンリストをバインドできますか?(モデル内で選択リストを使用するのは良い考えではないと思います)
Subin Jacob

15
@SubinJacobこれに対する回答が必要な場合は、本当に新しい質問を作成する必要があります。SelectListを作成することは、間違いなくドロップダウンリストを作成する方法です。
MiniRagnarok 2013年

25
それは少し主観的だと思います。強く型付けされたモデルを問わず、いいと矢田の矢田が、あなたはすぐにビュー稼働を取得しているシナリオのために、ViewBagかつ迅速などのViewModelにコントローラ、ビュー、モデル、AutoMapper、より仕事をしている
クレイグ・ブレット

11
@ダーリン、なぜこれを導入したのはマイクロソフトのせいなの?それは開発者に与えられる単なるツールです。自分のしていることがわかっていれば、それを最大限に活用できます。気に入らない、またはエラーが発生しやすいと感じた場合は、使用しないでください。:)
ビラルファズラニ

5
パーシャルとレイアウトの間でデータを渡すことをどのように提案しますか?全体像が見えないとき、人々は非難します。どこにでもベースコントローラとベースビューモデルまたは静的/シングルトンオブジェクトがあると思います。何を推測し、ビューデータの使い方を学び、ジョブに間違ったツールを使用したことを自責します。
Bart Calixto 2016

42

内部的には、ViewBagプロパティは名前と値のペアとしてViewDataディクショナリに格納されます。

注:MVC 3のほとんどのプレリリースバージョンでは、MVC 3リリースノートの次のスニペットに示されているように、ViewBagプロパティにViewModelという名前が付けられました。

(編集10-8-12)私が投稿したこの情報のソースを投稿するよう提案されました。これがソースです:http : //www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

MVC 2コントローラーは、遅延バインディング辞書APIを使用してビューテンプレートにデータを渡すことができるViewDataプロパティをサポートします。MVC 3では、ViewBagプロパティでやや単純な構文を使用して同じ目的を達成することもできます。たとえば、ViewData ["Message"] = "text"と書く代わりに、ViewBag.Message = "text"と書くことができます。ViewBagプロパティを使用するために、厳密に型指定されたクラスを定義する必要はありません。これは動的プロパティであるため、プロパティを取得または設定するだけで、実行時に動的に解決されます。内部的に、ViewBagプロパティは、名前/値のペアとしてViewDataディクショナリに格納されます。(注:MVC 3のほとんどのプレリリースバージョンでは、ViewBagプロパティはViewModelプロパティと呼ばれていました。)


質問では、ではなくViewDataとの違いを尋ねます。ViewBagViewModel
マシューFlaschen

ヘッズアップのMatthew Flaschenに感謝します。応答にタイプミスがあり、それを修正しましたが、ViewModelではなく「ViewData」と読みましたが、これは誤りでした。:)
リッチビアンコ

今では正しくありません。どちらも他の名前に変更されませんでした。どちらもまだ存在しています。1つはでdynamic、サポートしていますViewBag.Message。1つは古いViewData["Message"]構文を使用します。
マシューFlaschen

1
+1しかし、どのソースから引用していますか...?本当にリンクを提供する必要があります。
サム

1
提案をありがとうサム。元のソースへのリンクを追加しました。
Rich Bianco

34

MVCでのViewBagとViewData

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ViewBagとViewDataの類似点:

コントローラからビューに移動するときにデータを維持するのに役立ちます。コントローラから対応するビューにデータを渡すために使用されます。短い寿命とは、リダイレクトが発生したときに値がnullになることを意味します。これは、コントローラーとビューの間で通信する方法を提供することを目的としているためです。これは、サーバー呼び出し内の通信メカニズムです。

ViewBagとViewDataの違い:

ViewDataは、ViewDataDictionaryクラスから派生したオブジェクトのディクショナリであり、キーとして文字列を使用してアクセスできます。ViewBagは、C#4.0の新しい動的機能を利用する動的プロパティです。ViewDataは、複雑なデータ型の型キャストを必要とし、エラーを回避するためにnull値をチェックします。ViewBagは、複雑なデータ型の型キャストを必要としません。

ViewBagとViewDataの例:

public ActionResult Index()
{   
    ViewBag.Name = "Arun Prakash";   
    return View();
}

public ActionResult Index()
{  
    ViewData["Name"] = "Arun Prakash";  
    return View();
}   

ビューで呼び出す

@ViewBag.Name    
@ViewData["Name"]

7
あなたの答えは示してtypecastingいますが、型キャストの実行方法は示していませんでした
Alex

31

ViewData:エラーを回避するために、複雑なデータ型の型キャストとnull値のチェックが必要です。

ViewBag:複雑なデータ型の型キャストは必要ありません。

次の例について考えてみます。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}

のコードViewは次のとおりです。

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>

6
私が理解するのを助けますが、私は間違いがあると思います。これ <h4>@ViewBag.emp.Name</h4> は次のように変更されます<h4>@ViewBag.Employee.Name</h4>
Benny Margalit 2017年

24

すべての答えは、ことを示唆しているViewBag、および/またはViewDataからのデータを通過させることであるControllerViews誤報です。どちらも、ビューからレイアウトに、または部分的にビュー(またはViewComponentsなど)にデータを渡すのに非常に役立ちます。これは、コントローラー専用ではありません。

デフォルトのasp.netサンプルとして、レイアウトページにこれがあります。

<title>@ViewData["Title"] - MyApp</title>

そしてどんな見方でも

ViewData["Title"] = "Details";

それでは、質問をする:「何が違いだViewBagViewData?」

最も顕著な違いは、動的型であるのViewDataに対しViewBag、厳密に型指定された辞書 です。

内部のデータは同じです。

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

どちらを使用するのですか?

  • ViewBag無効なC#名はサポートされていません。あなたがアクセスすることはできませんViewData["Key With Space"]ViewBag
  • ViewBag.Something は動的であり、コンパイル時に正確なパラメータを知る必要があるメソッド(拡張メソッドなど)を呼び出すときに問題が発生する可能性があります。
  • ViewBag nulls構文クリーナーをチェックできます: ViewBag.Person?.Name
  • ViewData以下のような辞書のすべてのプロパティを持ってContainsKeyAddあなたが使用できるようになど、ViewData.Add("somekey", "somevalue")心に留めておくが、それは例外がスローされることがあります。
  • ViewDataビューで使用するにはTypeCastingが必要ですが、必要ありViewBagません。

微妙な違いを知って、どちらかを使用することは、はるかに好みの好みです。

通常、あなたはViewBag.AnyKeyのエイリアスに考えることができますViewData["AnyKey"]


1
これは受け入れられる答えになるはずです!
Prashant Pimpale

14

どちらも使用しないことをお勧めできますか?

画面にデータを「送信」する場合は、テストが簡単なため、厳密に型指定されたオブジェクト(別名ViewModel)を送信します。

ある種の「モデル」にバインドし、ランダムな「viewbag」または「viewdata」アイテムがあると、自動テストが非常に困難になります。

これらを使用している場合は、どのように再構築してViewModelを使用できるかを検討してください。


4
"コンパイラは最初の単体テストです"の原則を無視して、静的に型付けされたビューモデルは、コードを動的な型よりもテストしやすくする方法を教えてください。動的に型付けされたソリューションではテストの要件がより重要ですが、両方のソリューションが同じ数とタイプのテストを実装している場合、何も失うことはありません。
Darren Lewis

私は同意します、それは少しあいまいです。おそらくインテリセンスが関係しています。
Joshua Ramirez

1
一例は、あざけるでしょう。コントローラーアクションをユニットテストする場合は、「モック」オブジェクトを作成して、渡してアサートする方が、一部の文字列が一部のディクショナリに追加されたか、一部の動的フィールドが特定の値に設定されていると主張するよりも簡単です。複数のパラメーターを取るのではなく、1つの「リクエスト」オブジェクトと1つの「レスポンス」オブジェクトを持つサービスコントラクトと同様の概念。
nootn 2013年

どちらも使用しない場合、ビューからレイアウトにデータをどのように渡しますか?-1
バートキャリスト

これはどのように答えますか?
JSON


6

viewdata:ビューとコントローラの間でデータを保存するために使用されるディクショナリです。ビューデータオブジェクトをビュー内の対応するモデルにキャストして、そこからデータを取得できるようにする必要があります...

ViewBag:はビューデータと同様に機能する動的プロパティですが、ビューで使用する前に対応するモデルにキャストする必要がない方がいいです...


4

以下は、ViewData、ViewBag、TempData&Sessionのポイントツーポイントの違いです。 クレジット/コピーされたaskforprogram.in、ここに記載していないコード例のリンクをたどります。

  1. MVCのViewData

    • ViewDataはControllerBaseクラスのプロパティです。
    • ViewDataは、辞書オブジェクトの一種です。
    • ViewDataはキーと値の辞書コレクションです。
    • ViewDataはMVC 1.0バージョンで導入されました。
    • ViewDataは、.Net Framework 3.5以降で動作します。
    • 列挙中にコードの型変換を行う必要があります。
    • ViewDataオブジェクトは、現在のリクエストのデータのみを保持します。
  2. MVCのViewBag

    • ViewBagはControllerBaseクラスのプロパティです。
    • ViewBagは、動的オブジェクトの一種です。
    • ViewBagはオブジェクトの一種です。
    • ViewBagはMVC 3.0バージョンで導入されました。
    • ViewBagは、.Net Framework 4.0以上で動作します。
    • ViewBagはプロパティを使用して処理するため、列挙中に型変換を行う必要はありません。
    • ViewBagオブジェクトは、現在のリクエストのデータのみを保持します。
  3. MVCのTempData

    • TempDataはControllerBaseクラスのプロパティです。
    • TempDataは、辞書オブジェクトの一種です。
    • TempDataはキーと値の辞書コレクションです。
    • TempDataはMVC 1.0バージョンで導入されました。
    • TempDataは、.Net Framework 3.5以降で動作します。
    • 列挙中にコードの型変換を行う必要があります。
    • TempDataオブジェクトは、現在の要求と後続の要求の間のデータに使用されます。
  4. MVCでのセッション

    • セッションはController(Abstract Class)のプロパティです。
    • セッションは、HttpSessionStateBaseの一種です。
    • セッションはキーと値の辞書コレクションです。
    • セッションはMVC 1.0バージョンで導入されました。
    • TempDataは、.Net Framework 1.0以上で動作します。
    • 列挙中にコードの型変換を行う必要があります。
    • セッションオブジェクトは、すべてのリクエストのデータを保持します。すべてのリクエストに有効で、期限が切れることはありません。

1

1つの形式を他の形式よりも選択する技術的な利点はないかもしれませんが、2つの構文のいくつかの重要な違いに注意する必要があります。明らかな違いの1つは、アクセスしているキーが有効なC#識別子である場合にのみViewBagが機能することです。たとえば、ViewData ["Key With Spaces"]に値を配置すると、コードがコンパイルされないため、ViewBagを使用してその値にアクセスできません。考慮すべきもう1つの重要な問題は、拡張メソッドにパラメーターとして動的な値を渡すことができないことです。C#コンパイラは、正しい拡張メソッドを選択するために、コンパイル時にすべてのパラメータの実際のタイプを知っている必要があります。動的なパラメータがある場合、コンパイルは失敗します。たとえば、次のコードは常に失敗します:@ Html.TextBox( "name"、ViewBag.Name)。これを回避するには、ViewData ["Name"を使用します


0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 

0

このようにして、TEMP DATAでコントローラーから他のページに情報を渡すために値を使用することができます。


0

ViewDataとViewBagの間で気づいた1つの主な違いは次のとおりです。

ViewData:オブジェクトを返します。これに何を割り当てたかは関係ありません。元の型に再度型キャストする必要があります。

ViewBag:割り当てたものとまったく同じ型を返すのに十分スマートです。単純な型(int、stringなど)や複合型を割り当てた天候は関係ありません。

例:コントローラコード。

 namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Products p1 = new Products();
            p1.productId = 101;
            p1.productName = "Phone";
            Products p2 = new Products();
            p2.productId = 102;
            p2.productName = "laptop";

            List<Products> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

コードを表示します。

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

OutPut画面。

ここに画像の説明を入力してください


0

データを見る

  1. ViewDataは、コントローラーからビューにデータを渡すために使用されます
  2. ViewDataはViewDataDictionaryクラスから派生し、基本的にはディクショナリオブジェクトieKeysおよびValuesです。Keysは文字列で、Valuesはオブジェクトです。
  3. オブジェクトのデータ型と、型キャストの前にnullのvvalueチェックがあるため、ViewDataからデータを取得する際にデータの型キャストが必要です。そうでない場合、アプリケーションが破損します。リダイレクトが発生すると、その値はnullになります。TempDataViewDataとView Bagの完全な違いを読み取ります。

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html


0
ViewData
  1. ViewDataは、コントローラーからビューにデータを渡すために使用されます
  2. ViewDataDictionaryクラスから派生
  3. 現在のリクエストでのみ利用できます
  4. 複雑なデータ型の型キャストが必要で、エラーを回避するためにnull値をチェックします
  5. リダイレクトが発生すると、その値はnullになります
ViewBag
  1. ViewBagは、コントローラーからそれぞれのビューにデータを渡すためにも使用されます
  2. ViewBagは、C#4.0の新しい動的機能を利用する動的プロパティです。
  3. 現在のリクエストのみでも利用できます
  4. リダイレクトが発生すると、その値はnullになります
  5. 複雑なデータ型の型キャストは必要ありません

0

ここでは、ViewDataViewBagの両方を使用して、データをControllerからViewに渡します

1. ViewData

-ViewDataは、ViewDataDictonaryクラスから派生したディクショナリオブジェクトです。

-データは1つのリクエストのみを許可し、ページのリダイレクトが発生するとViewData値がクリアされます。

-ViewData値は、使用する前にcateと入力する必要があります。

例: コントローラ内

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

ビューで

@ViewData["Message"];

-ViewDataがKeyValueのようなペアである場合、MessageはKeyであり、逆のコンマの値はValueです。

-データは単純なので、データが複雑で型キャストを使用する場合、ここでは型キャストを使用できません。

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

-ビューでは、データを次のように抽出できます

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

--ViewBagは動的機能を使用します。ViewDataの周りのViewBagラッパー。

-ViewBagタイプではキャストが必要です。

-ViewDataと同じ、リダイレクトが発生した場合、値はnullになります。

例:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

ビューで

@ViewBag.vbMessage

-複合型の場合はViewBagを使用します

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

-ビューでは、データを次のように抽出できます

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

-主な違いは、ViewBagは型キャストを必要としないが、ViewDataは型キャストを必要とすることです。


-1

ViewBagとViewDataは、コントローラーからASP.Net MVCで表示する情報を渡すために使用される2つの手段です。両方のメカニズムを使用する目的は、コントローラーとビューの間の通信を提供することです。リダイレクトが発生すると、つまり、ページがソースページ(ViewBagまたはViewDataの値を設定した場所)からターゲットページにリダイレクトされると、ViewBagとViewDataの両方の両方の値がnullになるという短い寿命があります。 nullになります。

これらの類似点はあるものの(ViewBagとViewData)は、両方の実装について話すと2つの異なるものです。違いは次のとおりです。

1.)両方の実装を賢く分析すると、ViewDataがディクショナリデータ構造であることがわかります。ViewDataDictionaryから派生したオブジェクトのディクショナリで、これらの値のキーとして文字列を使用してアクセスできますが、ViewBagはC#4.0で導入された動的機能を利用します。動的プロパティです。

2.)ViewDataから値にアクセスするとき、値(データ型)はViewDataディクショナリにオブジェクトとして格納されるため、型キャストする必要がありますが、ViewBagの場合に値にアクセスする場合は、その必要はありません。

3.)ViewBagでは、次のように値を設定できます。

      ViewBag.Name = "Value"; 

次のようにアクセスできます。

          @ViewBag.Name

一方、ViewDataの場合、値は次のように設定およびアクセスできます。ViewDataを次のように設定します。

ViewData["Name"] = "Value";

このような値にアクセスする

 @ViewData["Name"] 

詳細については、ここをクリックしてください:


2
申し訳ありませんが私は反対票を投じましたが、この答えは何も役に立たないと言うためにいくつかの段落を取ります。受け入れ答えが文だろうから欠落便利な事は、私が学んだから「viewbagはViewDataをまわり、動的ラッパーである」rachelappel.com/...
クリス・F・キャロル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.