351

MVC 3 でを見ました。MVC 2ViewBagとどう違うのViewDataですか?

4

17 に答える 17

401

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

したがって、基本的には魔法の文字列を置き換えます:

ViewData["Foo"]

魔法の特性を持つ:

ViewBag.Foo

コンパイル時の安全性がありません。

私は、MVC にこの概念を導入した Microsoft を非難し続けています。

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

于 2011-01-16T12:54:14.357 に答える
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 プロパティと呼ばれていました。)

于 2011-05-16T20:55:06.407 に答える
35

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>
于 2013-09-25T16:38:15.400 に答える
33

ViewBagすべての回答は、 and/orが誤った情報からViewDataデータを渡すことを示唆しています。どちらも、ビューからレイアウトまたは部分的にビュー (または ViewComponents など) にデータを渡すのに非常に便利です。これは、コントローラー専用ではありません。ControllerViews

デフォルトの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動的であり、コンパイル時に正確なパラメーターを知る必要があるメソッド (拡張メソッドなど) を呼び出すときに問題が発生する可能性があります。
  • ViewBagnull 構文クリーナーをチェックできます。ViewBag.Person?.Name
  • ViewData、などのディクショナリのすべてのプロパティがあるためContainsKey、例外がスローされる可能性があることに注意してください。AddViewData.Add("somekey", "somevalue")
  • ビューで使用ViewDataするには TypeCasting が必要ですが、そうではありViewBagません。

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

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

于 2016-02-03T19:04:18.920 に答える
14

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

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

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

これらを使用している場合は、ViewModel を再構築して使用する方法を検討してください。

于 2011-12-22T11:21:28.810 に答える
11

ビューとは少し異なる方法で ViewData と ViewBag を使用できることを意味する、いくつかの微妙な違いがあります。利点の 1 つは、この投稿http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspxで概説されており、そのキャストが示されています。この例では、ViewData の代わりに ViewBag を使用することで回避できます。

于 2011-03-02T12:10:45.890 に答える
6

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

ViewBag:ビュー データと同様の動作をする動的プロパティですが、ビューで使用する前に対応するモデルにキャストする必要がないため、より優れています ...

于 2013-12-16T13:16:35.033 に答える
6

以下は、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 でのセッション

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

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

于 2016-03-08T12:49:35.997 に答える
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"] 
于 2014-03-27T10:38:57.657 に答える
0

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

于 2015-09-04T11:10:55.177 に答える
-1

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

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

于 2014-04-22T05:56:44.157 に答える