Saya melihat ViewBag
di MVC 3. Bagaimana bedanya dengan ViewData
di MVC 2?
Saya melihat ViewBag
di MVC 3. Bagaimana bedanya dengan ViewData
di MVC 2?
Jawaban:
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.
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.)
ViewData
dan ViewBag
, bukan tentang ViewModel
.
dynamic
dan mendukung ViewBag.Message
. Satu menggunakan ViewData["Message"]
sintaks lama .
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"]
typecasting
tetapi Anda tidak menunjukkan bagaimana melakukan typecasting
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 View
adalah 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>
<h4>@ViewBag.emp.Name</h4>
akan berubah menjadi<h4>@ViewBag.Employee.Name</h4>
Semua jawaban menyarankan itu ViewBag
dan / atau ViewData
untuk meneruskan data dari Controller
keViews
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 ViewBag
danViewData
?"
Perbedaan yang paling menonjol adalah ViewData
Kamus 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?
ViewBag
tidak 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
ViewData
memiliki semua sifat-sifat Kamus seperti ContainsKey
, Add
, dll sehingga Anda dapat menggunakanViewData.Add("somekey", "somevalue")
keep dalam pikiran mungkin membuang pengecualian.ViewData
pada pandangan membutuhkan TypeCasting sementara ViewBag
tidak.Mengetahui perbedaan halus, menggunakan satu atau yang lain lebih merupakan preferensi rasa.
Biasanya Anda dapat memikirkan ViewBag.AnyKey
aliasViewData["AnyKey"]
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.
Ada beberapa perbedaan halus yang berarti Anda dapat menggunakan ViewData dan ViewBag dengan cara yang sedikit berbeda dari tampilan. Satu keuntungan diuraikan dalam posting ini http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx dan menunjukkan bahwa casting dapat dihindari dalam contoh dengan menggunakan ViewBag bukan ViewData.
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 ...
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.
ViewData dalam MVC
ViewBag dalam MVC
TempData di MVC
Sesi dalam MVC
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"
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
Dengan cara ini kita dapat membuatnya menggunakan nilai untuk meneruskan informasi antara controller ke halaman lain dengan DATA TEMP
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 @item.productName</li>
}
</ul>
Layar OutPut.
Lihat Data
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
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.
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: