Apa perbedaan antara ViewData dan ViewBag?

Jawaban:

388

Ini menggunakan fitur dinamis C # 4.0. Ini mencapai tujuan yang sama dengan viewdata dan harus dihindari demi menggunakan model tampilan yang sangat diketik (cara yang sama seperti viewdata harus dihindari).

Jadi pada dasarnya itu menggantikan string ajaib :

ViewData["Foo"]

dengan sifat sihir :

ViewBag.Foo

di mana Anda tidak memiliki keamanan waktu kompilasi.

Saya terus menyalahkan Microsoft karena pernah memperkenalkan konsep ini dalam MVC.

Nama properti bersifat case sensitif.

Darin Dimitrov
sumber
11
Untuk tujuan apa Anda menyalahkan microsoft? Jika tidak ada viewdata bagaimana kita bisa mengikat dropdownlist dari model. (Saya tidak berpikir menggunakan model selectlist di dalam akan menjadi ide yang baik)
Subin Jacob
15
@ Sububajacob Anda harus benar-benar membuat pertanyaan baru jika Anda ingin jawaban untuk ini. Membuat SelectList jelas merupakan cara untuk membuat dropdownlist.
MiniRagnarok
25
Saya pikir itu sedikit subjektif. Model yang diketik sangat bagus dan yada yada, tetapi untuk skenario di mana Anda dengan cepat mendapatkan dan menjalankan tampilan, ViewBag dan sama-sama melakukan pekerjaan lebih cepat daripada Controller, View, Model, AutoMapper ke ViewModel, dll.
Craig Brett
11
@Darin, mengapa Anda "menyalahkan" Microsoft karena memperkenalkan ini? Itu hanya alat yang diberikan kepada pengembang. Jika Anda tahu apa yang Anda lakukan, Anda dapat memanfaatkannya sebaik mungkin. Jika Anda tidak menyukainya atau merasa lebih rentan terhadap kesalahan, jangan gunakan itu. :)
Bilal Fazlani
5
Bagaimana Anda menyarankan untuk meneruskan data antara sebagian dan tata letak? Orang menyalahkan ketika mereka tidak melihat gambaran lengkapnya. Saya membayangkan Anda memiliki basecontrollers dan model tampilan dasar atau objek statis / lajang di mana-mana. Coba tebak, lebih baik belajar menggunakan data tampilan dan menyalahkan diri sendiri karena menggunakan alat yang salah untuk pekerjaan itu.
Bart Calixto
42

Properti ViewBag secara internal disimpan sebagai pasangan nama / nilai dalam kamus ViewData .

Catatan: di sebagian besar versi pra-rilis MVC 3, properti ViewBag dinamai ViewModel seperti yang tercantum dalam cuplikan ini dari catatan rilis MVC 3:

(diedit 10-8-12) Disarankan agar saya memposting sumber info ini yang saya posting, berikut adalah sumbernya: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

Pengontrol MVC 2 mendukung properti ViewData yang memungkinkan Anda meneruskan data ke templat tampilan menggunakan API kamus yang diikat terlambat. Di MVC 3, Anda juga dapat menggunakan sintaksis yang lebih sederhana dengan properti ViewBag untuk mencapai tujuan yang sama. Misalnya, alih-alih menulis ViewData ["Message"] = "text", Anda dapat menulis ViewBag.Message = "text". Anda tidak perlu mendefinisikan kelas yang sangat diketik untuk menggunakan properti ViewBag. Karena ini adalah properti dinamis, Anda bisa mendapatkan atau mengatur properti dan itu akan menyelesaikannya secara dinamis pada saat run time. Secara internal, properti ViewBag disimpan sebagai pasangan nama / nilai dalam kamus ViewData. (Catatan: di sebagian besar versi pra-rilis MVC 3, properti ViewBag dinamai properti ViewModel.)

Bianco yang kaya
sumber
Pertanyaannya menanyakan perbedaan antara ViewDatadan ViewBag, bukan tentang ViewModel.
Matthew Flaschen
Terima kasih atas Matthew Flaschen, saya memiliki kesalahan ketik dalam respon dan memperbaikinya, sekarang membaca "ViewData" bukannya ViewModel yang merupakan kesalahan. :)
Rich Bianco
Sekarang salah. Tidak ada yang berganti nama menjadi yang lain. Keduanya masih ada. Satu adalah dynamicdan mendukung ViewBag.Message. Satu menggunakan ViewData["Message"]sintaks lama .
Matthew Flaschen
1
+1 Tapi, dari sumber mana Anda mengutip ...? Harus benar-benar memberikan tautan.
Sam
1
Terima kasih Sam atas sarannya. Saya telah menambahkan tautan ke sumber asli.
Rich Bianco
34

ViewBag vs ViewData di MVC

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

Kesamaan antara ViewBag & ViewData:

Membantu menjaga data saat Anda berpindah dari pengontrol ke tampilan. Digunakan untuk meneruskan data dari pengontrol ke tampilan yang sesuai. Umur pendek berarti nilai menjadi nol ketika pengalihan terjadi. Ini karena tujuan mereka adalah untuk menyediakan cara untuk berkomunikasi antara pengontrol dan pandangan. Ini adalah mekanisme komunikasi dalam panggilan server.

Perbedaan antara ViewBag & ViewData:

ViewData adalah kamus objek yang diturunkan dari kelas ViewDataDictionary dan dapat diakses menggunakan string sebagai kunci. ViewBag adalah properti dinamis yang memanfaatkan fitur dinamis baru di C # 4.0. ViewData membutuhkan typecasting untuk tipe data yang kompleks dan memeriksa nilai null untuk menghindari kesalahan. ViewBag tidak memerlukan typecasting untuk tipe data yang kompleks.

Contoh ViewBag & ViewData:

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

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

Memanggil dalam Tampilan

@ViewBag.Name    
@ViewData["Name"]
Arun Prakash
sumber
7
jawaban Anda menunjukkan typecastingtetapi Anda tidak menunjukkan bagaimana melakukan typecasting
Alex
31

ViewData: Membutuhkan pengecoran tipe untuk tipe data yang kompleks dan memeriksa nilai nol untuk menghindari kesalahan.

ViewBag: Tidak memerlukan casting tipe untuk tipe data yang kompleks.

Perhatikan contoh berikut:

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(); 
    }
}

Dan kodenya Viewadalah sebagai berikut:

@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>
Naresh Ravlani
sumber
6
bantu saya untuk menguraikan tetapi saya pikir ada kesalahan. ini <h4>@ViewBag.emp.Name</h4> akan berubah menjadi<h4>@ViewBag.Employee.Name</h4>
Benny Margalit
24

Semua jawaban menyarankan itu ViewBagdan / atau ViewDatauntuk meneruskan data dari ControllerkeViews yang salah informasi. keduanya sangat berguna untuk meneruskan data dari Views ke Layout atau Partial to Views (atau ViewComponents, dll) Ini bukan kontroler eksklusif.

sebagai sampel asp.net default memilikinya di halaman tata letak:

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

dan dalam tampilan apa pun

ViewData["Title"] = "Details";

Jadi, untuk mengajukan pertanyaan: "apa perbedaan antara ViewBagdanViewData ?"

Perbedaan yang paling menonjol adalah ViewDataKamus Sangat Diketik sementara ViewBag jenis dinamis.

Perhatikan bahwa data di dalamnya SAMA

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

Kapan harus menggunakan satu atau yang lain?

  • ViewBagtidak mendukung nama C # yang tidak valid. Anda tidak dapat mengakses ViewData["Key With Space"]denganViewBag
  • ViewBag.Something dinamis dan Anda mungkin memiliki masalah saat memanggil metode (seperti metode ekstensi) yang perlu mengetahui parameter yang tepat pada waktu kompilasi.
  • ViewBag dapat memeriksa nulls pembersih sintaksis: ViewBag.Person?.Name
  • ViewDatamemiliki semua sifat-sifat Kamus seperti ContainsKey, Add, dll sehingga Anda dapat menggunakanViewData.Add("somekey", "somevalue") keep dalam pikiran mungkin membuang pengecualian.
  • Menggunakan ViewDatapada pandangan membutuhkan TypeCasting sementara ViewBagtidak.

Mengetahui perbedaan halus, menggunakan satu atau yang lain lebih merupakan preferensi rasa.

Biasanya Anda dapat memikirkan ViewBag.AnyKeyaliasViewData["AnyKey"]

Bart Calixto
sumber
14

Bisakah saya merekomendasikan kepada Anda untuk tidak menggunakan keduanya?

Jika Anda ingin "mengirim" data ke layar Anda, kirim objek yang sangat diketik (AKA ViewModel) karena lebih mudah untuk diuji.

Jika Anda mengikat ke beberapa jenis "Model" dan memiliki item "viewbag" atau "viewdata" acak maka itu membuat pengujian otomatis sangat sulit.

Jika Anda menggunakan ini pertimbangkan bagaimana Anda bisa merestrukturisasi dan cukup menggunakan ViewModels.

nootn
sumber
4
Mengabaikan prinsip "compiler is the first unit test" bagaimana model tampilan yang diketik secara statis membuat kode Anda lebih dapat diuji daripada tipe dinamis? Sementara persyaratan untuk tes lebih penting dalam solusi yang diketik secara dinamis, jika kedua solusi menerapkan jumlah dan jenis tes yang sama Anda tidak kehilangan apa-apa.
Darren Lewis
Saya setuju, ini sedikit kabur. Mungkin intellisense terlibat.
Joshua Ramirez
1
Salah satu contohnya adalah mengejek. Jika Anda ingin menguji unit pengontrol, lebih mudah untuk membuat objek "tiruan" untuk dilewatkan dan ditegaskan daripada mencoba menegaskan bahwa beberapa string ditambahkan ke kamus atau bidang dinamis diatur ke beberapa nilai - itu adalah konsep yang mirip dengan kontrak layanan yang memiliki satu objek "Permintaan" dan satu "Respons", daripada mengambil beberapa parameter.
nootn
bagaimana Anda akan meneruskan data dari Lihat ke Layout jika tidak menggunakan keduanya? -1
Bart Calixto
Bagaimana ini jawabannya?
JSON
6

viewdata: adalah kamus yang digunakan untuk menyimpan data antara View dan controller, Anda perlu melemparkan objek data view ke model yang sesuai dalam view untuk dapat mengambil data dari itu ...

ViewBag: adalah properti dinamis yang serupa dalam bekerja dengan data tampilan, Namun lebih baik karena tidak perlu dicor ke model yang sesuai sebelum menggunakannya dalam tampilan ...

Ahmed Elbatt
sumber
4

Di bawah ini adalah perbedaan point to point tentang ViewData, ViewBag, TempData & Session. Credit / copy askforprogram.in , Ikuti tautan untuk contoh kode yang belum saya sebutkan di sini.

  1. ViewData dalam MVC

    • ViewData adalah properti dari kelas ControllerBase.
    • ViewData adalah jenis objek kamus.
    • ViewData adalah kumpulan kamus nilai kunci.
    • ViewData diperkenalkan dalam versi MVC 1.0.
    • ViewData berfungsi dengan .Net framework 3.5 ke atas.
    • Perlu melakukan konversi jenis kode saat enumerasi.
    • Objek ViewData menyimpan data hanya untuk permintaan saat ini.
  2. ViewBag dalam MVC

    • ViewBag adalah properti dari kelas ControllerBase.
    • ViewBag adalah jenis objek dinamis.
    • ViewBag adalah jenis objek.
    • ViewBag diperkenalkan dalam versi MVC 3.0.
    • ViewBag bekerja dengan .Net framework 4.0 dan lebih tinggi.
    • ViewBag menggunakan properti dan menanganinya, jadi tidak perlu melakukan konversi tipe saat enumerasi.
    • Objek ViewBag menyimpan data hanya untuk permintaan saat ini.
  3. TempData di MVC

    • TempData adalah properti dari kelas ControllerBase.
    • TempData adalah jenis objek kamus.
    • TempData adalah kumpulan kamus nilai kunci.
    • TempData diperkenalkan dalam versi MVC 1.0.
    • TempData berfungsi dengan .Net framework 3.5 ke atas.
    • Perlu melakukan konversi jenis kode saat enumerasi.
    • Objek TempData digunakan untuk data antara permintaan saat ini dan permintaan berikutnya.
  4. Sesi dalam MVC

    • Sesi adalah milik Pengendali (Kelas Abstrak).
    • Sesi adalah jenis HttpSessionStateBase.
    • Sesi adalah koleksi kamus bernilai kunci.
    • Sesi diperkenalkan dalam versi MVC 1.0.
    • TempData bekerja dengan .Net framework 1.0 dan lebih tinggi.
    • Perlu melakukan konversi jenis kode saat enumerasi.
    • Objek sesi menyimpan data untuk semua permintaan. Berlaku untuk semua permintaan, tidak pernah kedaluwarsa.
Nirju
sumber
1

Meskipun Anda mungkin tidak memiliki keunggulan teknis untuk memilih satu format daripada yang lain, Anda harus menyadari beberapa perbedaan penting antara kedua sintaksis. Satu perbedaan yang jelas adalah bahwa ViewBag hanya berfungsi ketika kunci yang Anda akses adalah pengidentifikasi C # yang valid. Misalnya, jika Anda menempatkan nilai di ViewData ["Key With Spaces"], Anda tidak dapat mengakses nilai itu menggunakan ViewBag karena kode tidak akan dikompilasi. Masalah utama lain yang perlu dipertimbangkan adalah bahwa Anda tidak dapat memberikan nilai dinamis sebagai parameter untuk metode ekstensi. Compiler C # harus mengetahui tipe sebenarnya dari setiap parameter pada waktu kompilasi untuk memilih metode ekstensi yang benar. Jika ada parameter yang dinamis, kompilasi akan gagal. Misalnya, kode ini akan selalu gagal: @ Html.TextBox ("name", ViewBag.Name). Untuk mengatasinya, gunakan ViewData ["Name"

pengguna2211290
sumber
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"] 
dilipkumar1007
sumber
0

Dengan cara ini kita dapat membuatnya menggunakan nilai untuk meneruskan informasi antara controller ke halaman lain dengan DATA TEMP

pengguna3141962
sumber
0

Satu perbedaan utama yang saya perhatikan antara ViewData dan ViewBag adalah:

ViewData: itu akan mengembalikan objek tidak peduli apa yang telah Anda tetapkan ke dalam ini dan perlu mengetik lagi kembali ke tipe aslinya.

ViewBag: cukup cerdas untuk mengembalikan tipe yang tepat apa yang telah Anda tetapkan untuk itu. Tidak masalah cuaca apa pun yang telah Anda tetapkan tipe sederhana (mis. Int, string, dll.) Atau tipe kompleks.

Mis: Kode pengontrol.

 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; }
    }
}

Lihat Kode.

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

Layar OutPut.

masukkan deskripsi gambar di sini

Bhanu Pratap
sumber
0

Lihat Data

  1. ViewData digunakan untuk meneruskan data dari pengontrol ke tampilan
  2. ViewData diturunkan dari kelas ViewDataDictionary dan pada dasarnya adalah objek Kamus ieKeys dan Nilai di mana Kunci adalah String sedangkan Nilai akan menjadi objek.
  3. Pengetikan data diperlukan saat mengambil data dari ViewData karena tipe objeknya data dan juga null vvalue check sebelum tipe casting jika tidak akan merusak aplikasi. Jika pengalihan terjadi, maka nilainya menjadi nol Baca perbedaan penuh antara TempData ViewData dan View Bag

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

Jatin Phulera
sumber
0
ViewData
  1. ViewData digunakan untuk meneruskan data dari pengontrol ke tampilan
  2. Ini berasal dari kelas ViewDataDictionary
  3. Ini tersedia hanya untuk permintaan saat ini
  4. Memerlukan typecasting untuk tipe data yang kompleks dan memeriksa nilai-nilai nol untuk menghindari kesalahan
  5. Jika pengalihan terjadi, maka nilainya menjadi nol
ViewBag
  1. ViewBag juga digunakan untuk meneruskan data dari pengontrol ke tampilan masing-masing
  2. ViewBag adalah properti dinamis yang memanfaatkan fitur dinamis baru di C # 4.0
  3. Ini juga tersedia untuk permintaan saat ini saja
  4. Jika pengalihan terjadi, maka nilainya menjadi nol
  5. Tidak memerlukan typecasting untuk tipe data yang kompleks
Er Pravin Suthar
sumber
0

Di sini ViewData dan ViewBag keduanya menggunakan data pass dari Controller ke View .

1. ViewData

- ViewData adalah objek kamus yang diturunkan dari kelas ViewDataDictonary .

- Data hanya memungkinkan untuk satu permintaan, nilai-nilai ViewData akan dihapus ketika terjadi pengalihan halaman.

- Nilai ViewData harus diketikkan sebelum digunakan.

Contoh: Di Kontroler

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

Dalam penglihatan

@ViewData["Message"];

- Dengan ViewData adalah pasangan seperti Kunci dan Nilai , Pesan adalah Kunci dan dalam nilai koma terbalik adalah Nilai.

- Data sederhana sehingga kita tidak bisa menggunakan typecasting di sini jika data kompleks kemudian menggunakan tipe casting.

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

- Dalam Lihat data dapat diekstraksi sebagai

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

2. ViewBag

--ViewBag menggunakan fitur dinamis. Wrapper ViewView sekitar ViewData.

- Dalam casting tipe ViewBag diperlukan.

- Sama seperti ViewData, jika pengalihan terjadi, nilai menjadi nol.

Contoh:

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

Dalam penglihatan

@ViewBag.vbMessage

--Untuk tipe yang kompleks gunakan ViewBag

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

- Dalam Lihat data dapat diekstraksi sebagai

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

- perbedaan utama adalah ViewBag tidak diperlukan typecasting tetapi ViewData diperlukan typecasting.

Brijesh Mavani
sumber
-1

ViewBag dan ViewData adalah dua cara yang digunakan untuk meneruskan informasi dari controller ke view di ASP.Net MVC. Tujuan menggunakan kedua mekanisme ini adalah untuk menyediakan komunikasi antara controller dan View. Keduanya memiliki umur pendek yaitu nilai keduanya menjadi nol setelah pengalihan terjadi yaitu, setelah halaman dialihkan dari halaman sumber (di mana kami menetapkan nilai ViewBag atau ViewData) ke halaman target, baik ViewBag dan juga ViewData menjadi nol.

Meski memiliki kesamaan ini baik (ViewBag dan ViewData) adalah dua hal yang berbeda jika kita berbicara tentang implementasi keduanya. Perbedaannya adalah sebagai berikut:

1.) Jika kita menganalisis kedua implementasi dengan bijak maka kita akan menemukan bahwa ViewData adalah struktur data kamus - Kamus Objek berasal dari ViewDataDictionary dan dapat diakses menggunakan string sebagai Kunci untuk nilai-nilai ini sementara ViewBag menggunakan fitur dinamis yang diperkenalkan pada C # 4.0 dan adalah properti yang dinamis.

2.) Ketika mengakses nilai dari ViewData, kita perlu mengetikkan nilai (datatypes) karena mereka disimpan sebagai Objects dalam kamus ViewData tetapi tidak ada kebutuhan seperti itu jika kita mengakses nilai th dalam kasus ViewBag.

3.) Di ViewBag kita dapat menetapkan nilai seperti ini:

      ViewBag.Name = "Value"; 

dan dapat mengakses sebagai berikut:

          @ViewBag.Name

Sedangkan dalam kasus ViewData nilai-nilai dapat diatur dan diakses sebagai berikut: Mengatur ViewData sebagai berikut:

ViewData["Name"] = "Value";

dan mengakses nilai seperti ini

 @ViewData["Name"] 

Untuk lebih jelasnya klik di sini:

Abhishek Gahlout
sumber
2
maaf saya tidak memilih tetapi jawaban ini membutuhkan beberapa paragraf untuk mengatakan tidak ada yang berguna. Hal berguna yang hilang dari jawaban yang diterima adalah kalimat "viewbag adalah pembungkus dinamis di sekitar viewdata" yang saya pelajari dari rachelappel.com/...
Chris F Carroll