ViewBag
MVC 3でを見ました。MVC2とはどう違うのViewData
ですか?
ViewBag
MVC 3でを見ました。MVC2とはどう違うのViewData
ですか?
回答:
C#4.0動的機能を使用します。これはviewdataと同じ目標を達成するため、厳密に型指定されたビューモデルを使用することを避けてください(viewdataと同じ方法で回避する必要があります)。
つまり、基本的にはマジックストリングを置き換えます。
ViewData["Foo"]
魔法のプロパティ:
ViewBag.Foo
コンパイル時の安全性がない場合。
この概念をMVCに導入したことについて、マイクロソフトを非難し続けています。
プロパティの名前は大文字と小文字が区別されます。
内部的には、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
との違いを尋ねます。ViewBag
ViewModel
dynamic
、サポートしていますViewBag.Message
。1つは古いViewData["Message"]
構文を使用します。
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"]
typecasting
いますが、型キャストの実行方法は示していませんでした
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>
<h4>@ViewBag.emp.Name</h4>
は次のように変更されます<h4>@ViewBag.Employee.Name</h4>
すべての答えは、ことを示唆しているViewBag
、および/またはViewData
からのデータを通過させることであるController
とViews
誤報です。どちらも、ビューからレイアウトに、または部分的にビュー(またはViewComponentsなど)にデータを渡すのに非常に役立ちます。これは、コントローラー専用ではありません。
デフォルトのasp.netサンプルとして、レイアウトページにこれがあります。
<title>@ViewData["Title"] - MyApp</title>
そしてどんな見方でも
ViewData["Title"] = "Details";
それでは、質問をする:「何が違いだViewBag
とViewData
?」
最も顕著な違いは、動的型であるのViewData
に対しViewBag
、厳密に型指定された辞書
です。
内部のデータは同じです。
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
どちらを使用するのですか?
ViewBag
無効なC#名はサポートされていません。あなたがアクセスすることはできませんViewData["Key With Space"]
でViewBag
ViewBag.Something
は動的であり、コンパイル時に正確なパラメータを知る必要があるメソッド(拡張メソッドなど)を呼び出すときに問題が発生する可能性があります。ViewBag
nulls構文クリーナーをチェックできます: ViewBag.Person?.Name
ViewData
以下のような辞書のすべてのプロパティを持ってContainsKey
、Add
あなたが使用できるようになど、ViewData.Add("somekey", "somevalue")
心に留めておくが、それは例外がスローされることがあります。ViewData
ビューで使用するにはTypeCastingが必要ですが、必要ありViewBag
ません。微妙な違いを知って、どちらかを使用することは、はるかに好みの好みです。
通常、あなたはViewBag.AnyKey
のエイリアスに考えることができますViewData["AnyKey"]
どちらも使用しないことをお勧めできますか?
画面にデータを「送信」する場合は、テストが簡単なため、厳密に型指定されたオブジェクト(別名ViewModel)を送信します。
ある種の「モデル」にバインドし、ランダムな「viewbag」または「viewdata」アイテムがあると、自動テストが非常に困難になります。
これらを使用している場合は、どのように再構築してViewModelを使用できるかを検討してください。
ViewとViewBagをビューとは少し異なる方法で使用できることを意味する微妙な違いがあります。1つの利点は、この投稿http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspxで概説されており、そのキャストを示していますこの例では、ViewDataの代わりにViewBagを使用することで回避できます。
viewdata:ビューとコントローラの間でデータを保存するために使用されるディクショナリです。ビューデータオブジェクトをビュー内の対応するモデルにキャストして、そこからデータを取得できるようにする必要があります...
ViewBag:はビューデータと同様に機能する動的プロパティですが、ビューで使用する前に対応するモデルにキャストする必要がない方がいいです...
以下は、ViewData、ViewBag、TempData&Sessionのポイントツーポイントの違いです。 クレジット/コピーされたaskforprogram.in、ここに記載していないコード例のリンクをたどります。
MVCのViewData
MVCのViewBag
MVCのTempData
MVCでのセッション
1つの形式を他の形式よりも選択する技術的な利点はないかもしれませんが、2つの構文のいくつかの重要な違いに注意する必要があります。明らかな違いの1つは、アクセスしているキーが有効なC#識別子である場合にのみViewBagが機能することです。たとえば、ViewData ["Key With Spaces"]に値を配置すると、コードがコンパイルされないため、ViewBagを使用してその値にアクセスできません。考慮すべきもう1つの重要な問題は、拡張メソッドにパラメーターとして動的な値を渡すことができないことです。C#コンパイラは、正しい拡張メソッドを選択するために、コンパイル時にすべてのパラメータの実際のタイプを知っている必要があります。動的なパラメータがある場合、コンパイルは失敗します。たとえば、次のコードは常に失敗します:@ Html.TextBox( "name"、ViewBag.Name)。これを回避するには、ViewData ["Name"を使用します
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
このようにして、TEMP DATAでコントローラーから他のページに情報を渡すために値を使用することができます。
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 @item.productName</li>
}
</ul>
OutPut画面。
データを見る
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
ここでは、ViewDataとViewBagの両方を使用して、データを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がKeyとValueのようなペアである場合、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は型キャストを必要とすることです。
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"]
詳細については、ここをクリックしてください: