の違いについて教えてくださいViewDataとViewBag?
-
11-10-2019 - |
質問
私の ViewBag
にMVC3.このようなこと以外 ViewData
にMVC2?
解決
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プロパティと名付けられました。)
MVCのViewBag vs ViewData
http://royarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ViewBagとViewdataの類似点:
コントローラーから表示に移動するときにデータを維持するのに役立ちます。コントローラーから対応するビューにデータを渡すために使用されます。短い寿命は、リダイレクトが発生すると価値がヌルになることを意味します。これは、彼らの目標がコントローラーとビュー間で通信する方法を提供することであるためです。これは、サーバーコール内の通信メカニズムです。
ViewBagとViewdataの違い:
ViewDataは、ViewDataDictionaryクラスから派生したオブジェクトの辞書であり、キーとして文字列を使用してアクセス可能です。 ViewBagは、C#4.0の新しい動的機能を活用する動的プロパティです。 ViewDataでは、複雑なデータ型のタイプキャストが必要であり、エラーを回避するためにヌル値を確認します。 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"]
ViewData
: :エラーを回避するには、複雑なデータ型のタイプキャストとヌル値をチェックする必要があります。
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>
すべての答えはそれを示唆しています ViewBag
および/または ViewData
からデータを渡すことです Controller
に Views
これは誤った情報です。どちらも、ビューからレイアウト、またはビュー(またはビューコンポーネントなど)に部分的にデータを渡すのに非常に役立ちます。コントローラー限定ではありません。
デフォルトの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
ビューでは、タイプキャストが必要ですViewBag
しないでください。
微妙な違いを知って、一方を使用することは、はるかに味の好みです。
通常、あなたは考えることができます ViewBag.AnyKey
のエイリアスへ ViewData["AnyKey"]
どちらも使用しないことをお勧めしますか?
画面にデータを「送信」したい場合は、テストが簡単であるため、強くタイプされたオブジェクト(別名ViewModel)を送信します。
ある種の「モデル」にバインドし、ランダムな「ViewBag」または「ViewData」アイテムを持っていると、自動テストが非常に困難になります。
これらを使用している場合は、ViewModelsを再構築して使用する方法を検討してください。
ビューからわずかに異なる方法でViewDataとViewBagを使用できることを意味する微妙な違いがあります。この投稿では、1つの利点が概説されています http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx また、ビューダタの代わりにViewBagを使用して、例で鋳造を回避できることを示しています。
viewdata: ビューとコントローラーの間にデータを保存するために使用される辞書です。あなたは、データからデータを取得できるように、ビューでビューデータオブジェクトを対応するモデルにキャストする必要があります...
ViewBag: ビューデータに動作する動的プロパティですが、ビューで使用する前にCORRESSPONDINGモデルにキャストする必要がない場合が優れています...
以下は、ViewData、ViewBag、Tempdata、Sessionのポイントの違いです。クレジット/コピーaskforprogram.in 、ここで言及していないコードの例に従ってください。
MVCのViewData
- ViewDataは、ControlleBaseクラスのプロパティです。
- ViewDataは辞書オブジェクトの一種です。
- ViewDataは、キー価値の辞書コレクションです。
- ViewDataはMVC 1.0バージョンで導入されました。
- ViewDataは、.NETフレームワーク3.5以上で動作します。
- 列挙中にコードのタイプ変換を行う必要があります。
- ViewDataオブジェクトは、現在の要求に対してのみデータを保持します。
MVCのViewBag
- ViewBagは、ControlleBaseクラスのプロパティです。
- ViewBagは動的オブジェクトの一種です。
- ViewBagはオブジェクトの一種です。
- ViewBagはMVC 3.0バージョンで導入されました。
- ViewBagは、.NETフレームワーク4.0以上で動作します。
- ViewBagはプロパティを使用して処理するため、列挙中にタイプ変換を行う必要はありません。
- ViewBagオブジェクトは、現在の要求に対してのみデータを保持します。
MVCのTempdata
- Tempdataは、Controllbaseクラスの特性です。
- TempDataは、辞書オブジェクトの一種です。
- TempDataは、キー価値の辞書コレクションです。
- TempDataはMVC 1.0バージョンで導入されました。
- TempDataは、.NETフレームワーク3.5以上で動作します。
- 列挙中にコードのタイプ変換を行う必要があります。
- TempDataオブジェクトは、現在の要求と後続の要求の間のデータに使用されます。
MVCでのセッション
- セッションはコントローラーのプロパティ(要約クラス)です。
- セッションは、HTTPSESTIONSTATEBASEの一種です。
- セッションはキー価値辞書コレクションです。
- セッションはMVC 1.0バージョンで導入されました。
- TempDataは、.NETフレームワーク1.0以上で動作します。
- 列挙中にコードのタイプ変換を行う必要があります。
- セッションオブジェクトは、すべてのリクエストのデータを保持します。すべてのリクエストに対して有効であり、有効期限はありません。
がない場合がございますっての技術的利点を選びには格別のこだわりを持つフォーマットの上 のその他に注意する必要がありますの一部の重要な差異の 構文.一明らかな違いは、ViewBagの場合にのみキーだけにアクセス 有効なC#identifi。例えば、場所に価値ViewData["キー スペース"],アクセスできない価値をViewBagでのコード なコンパイル。重要な問題を考えることはできませんパスダイナミックに値をパラメータとして に延長す。のC#コンパイラを知らなければ、リアルタイプの パラメータをコンパイル時間を選択するためには、正しい拡張方法です。する場合のパラメータが動作成に失敗します。例えば、このコード 常に失敗す:@ます。テキストボックス("氏名"、ViewBag.名)となります。このいずれか 利用ViewData[名前]またはキャストのva
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データを使用してコントローラー間の情報を他のページに渡すために値を使用することができます
ViewDataとViewBagの間で私が気づいた主な違いの1つは、次のとおりです。
ViewData:オブジェクトを返します。これに何を割り当てたかは関係ありません。また、元のタイプに再びタイプキャストする必要があります。
ViewBag:割り当てたものを正確なタイプに返すのに十分なスマートであり、シンプルなタイプ(IE int、文字列など)または複雑なタイプを割り当てた天気は関係ありません。
例:コントローラーコード。
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>
出力画面。
データを表示します
- ViewDataは、コントローラーからデータを渡すためにデータを渡すために使用されます
- ViewDataはViewDataDictionaryクラスから派生しており、基本的には辞書オブジェクトIEKEYSおよび値であり、キーは文字列であり、値はオブジェクトです。
- Data Typcastingは、オブジェクトタイプのデータとNull VValue Checkのために、ViewDataからデータを取得するときに必要です。リダイレクトが発生した場合、その値はnullになり、tempdata viewdataとビューバッグの完全な違いを読み取ります
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
- ViewDataは、コントローラーからデータを渡すためにデータを渡すために使用されます
- ViewDataDictionaryクラスから派生しています
- 現在のリクエストのみが利用できます
- エラーを回避するには、複雑なデータ型のタイプキャストとヌル値をチェックする必要があります
- リダイレクトが発生した場合、その値はnullになります
- ViewBagは、コントローラーからそれぞれのビューにデータを渡すためにも使用されます
- ViewBagは、C#4.0の新しい動的機能を利用する動的プロパティです
- また、現在のリクエストのみで利用できます
- リダイレクトが発生した場合、その値はnullになります
- 複雑なデータ型のタイプキャストは必要ありません
ここ Viewdata と ViewBag どちらも使用されます コントローラ に 意見.
1. ViewData
-ViewDataは、派生した辞書オブジェクトです viewdatadictonary クラス。
- データは1つのリクエストのみを許可し、Page Redirectingが発生するとViewData値がクリアされます。
- ビューダタ値は、使用する前にCATEと入力する必要があります。
例: コントローラーで
public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return View();
}
ビューで
@ViewData["Message"];
-ViewDataは似ています 鍵 と 価値, 、メッセージが重要であり、逆コンマ値は価値です。
- データは簡単なので、データが複雑な場合はタイプキャストを使用してタイプキャストを使用できません。
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の周りに動的feature.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から派生したオブジェクトの辞書であり、これらの値のキーとして文字列を使用してアクセス可能であることがわかります。動的なプロパティです。
2.)ViewDataフォームの値にアクセスしているときに、ViewData辞書にオブジェクトとして保存されている値(データ型)を型付けする必要がありますが、ViewBagの場合に値にアクセスしている場合、そのような必要はありません。
3.)ViewBagでは、次のような値を設定できます。
ViewBag.Name = "Value";
次のようにアクセスできます。
@ViewBag.Name
ViewDataの場合、値は次のように設定およびアクセスできます。ViewDataを次のように設定します。
ViewData["Name"] = "Value";
そして、このような価値にアクセスします
@ViewData["Name"]
詳細については ここをクリック: