gördüm ViewBag
MVC 3'teViewData
. MVC 2'den farkı nedir?
gördüm ViewBag
MVC 3'teViewData
. MVC 2'den farkı nedir?
Yanıtlar:
C # 4.0 dinamik özelliğini kullanır. Viewdata ile aynı hedefe ulaşır ve güçlü yazılan view modelleri kullanmaktan kaçınılmalıdır (viewdata ile aynı şekilde kullanılmamalıdır).
Temel olarak sihirli dizelerin yerini alıyor :
ViewData["Foo"]
ile sihirli özellikleri :
ViewBag.Foo
bunun için derleme zamanı güvenliğiniz yoktur.
MVC'de bu konsepti tanıttığı için Microsoft'u suçlamaya devam ediyorum.
Özelliklerin adı büyük / küçük harfe duyarlıdır.
Dahili olarak ViewBag özellikleri, ViewData sözlüğünde ad / değer çiftleri olarak depolanır .
Not: MVC 3'ün yayın öncesi sürümlerinin çoğunda, ViewBag özelliği MVC 3 sürüm notlarındaki bu snippet'te belirtildiği gibi ViewModel olarak adlandırılmıştır:
(10-8-12 tarihinde düzenlendi) Yayınladığım bu bilginin kaynağını yayınlamam önerildi, işte kaynak: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
MVC 2 denetleyicileri, geç bağlı sözlük API'sini kullanarak bir görünüm şablonuna veri aktarmanızı sağlayan bir ViewData özelliğini destekler. MVC 3'te, aynı amacı gerçekleştirmek için ViewBag özelliğiyle biraz daha basit bir sözdizimi de kullanabilirsiniz. Örneğin, ViewData ["Message"] = "text" yazmak yerine ViewBag.Message = "text" yazabilirsiniz. ViewBag özelliğini kullanmak için güçlü yazılan sınıflar tanımlamanız gerekmez. Dinamik bir özellik olduğu için, yalnızca özellikleri alabilir veya ayarlayabilir ve bunları çalışma zamanında dinamik olarak çözebilirsiniz. Dahili olarak, ViewBag özellikleri ViewData sözlüğünde ad / değer çiftleri olarak depolanır. (Not: MVC 3'ün yayın öncesi sürümlerinin çoğunda ViewBag özelliği ViewModel özelliği olarak adlandırılmıştır.)
ViewData
ve ViewBag
değil arasındaki farkı soruyor ViewModel
.
dynamic
ve destekler ViewBag.Message
. Birisi eski ViewData["Message"]
sözdizimini kullanır .
MVC'de ViewBag vs ViewData
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
ViewBag ve ViewData arasındaki benzerlikler:
Denetleyiciden görünüme geçtiğinizde verilerin korunmasına yardımcı olur. Verileri denetleyiciden karşılık gelen görünüme geçirmek için kullanılır. Kısa ömür, yeniden yönlendirme gerçekleştiğinde değerin boş kaldığı anlamına gelir. Çünkü hedefleri kontrolörler ve görüşler arasında iletişim kurmak için bir yol sağlamaktır. Sunucu çağrısı içindeki bir iletişim mekanizmasıdır.
ViewBag ve ViewData arasındaki fark:
ViewData, ViewDataDictionary sınıfından türetilmiş ve anahtarlar olarak dizeler kullanılarak erişilebilen nesnelerin sözlüğüdür. ViewBag, C # 4.0'daki yeni dinamik özelliklerden yararlanan dinamik bir özelliktir. ViewData karmaşık veri türü için yazım gerektirir ve hatayı önlemek için null değerleri kontrol edin. ViewBag, karmaşık veri türü için yazım gerektirmez.
ViewBag & ViewData Örneği:
public ActionResult Index()
{
ViewBag.Name = "Arun Prakash";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
Görünümde Arama
@ViewBag.Name
@ViewData["Name"]
typecasting
ancak daktilo işleminin nasıl yapıldığını göstermediniz
ViewData
: Karmaşık veri türleri için tür dökümü gerektirir ve hataları önlemek için null değerleri kontrol eder.
ViewBag
: Karmaşık veri türleri için tür dökümü gerektirmez.
Aşağıdaki örneği düşünün:
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();
}
}
Ve kodu View
aşağıdaki gibidir:
@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>
şekilde değişmelidir<h4>@ViewBag.Employee.Name</h4>
Bütün cevaplar düşündürmektedir ViewBag
ve / veya ViewData
veri geçmektir Controller
içinViews
yanlış olan. her ikisi de verileri Görünümlerden Mizanpaj'a veya Kısmi Görünümlere (veya ViewComponents, vb.) aktarmak için çok faydalıdır.
varsayılan asp.net örneği mizanpaj sayfasında bu var:
<title>@ViewData["Title"] - MyApp</title>
ve herhangi bir görüşte
ViewData["Title"] = "Details";
O zaman şu soruyu sormak için: " ViewBag
ve " arasındaki fark nedirViewData
nedir?"
En dikkate değer fark ViewData
Güçlü Yazılı Sözlük iken
ViewBag
Dinamik Tip .
İçindeki verilerin aynı olduğunu unutmayın
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
Biri veya diğeri ne zaman kullanılır?
ViewBag
geçerli C # adlarını desteklemiyor. ViewData["Key With Space"]
ile erişemezsinViewBag
ViewBag.Something
dinamiktir ve derleme zamanında tam parametreyi bilmesi gereken yöntemleri (uzantı yöntemleri gibi) çağırırken sorun yaşayabilirsiniz.ViewBag
nulls sözdizimi temizleyici kontrol edebilirsiniz: ViewBag.Person?.Name
ViewData
gibi bir Dictionary tüm özelliklerine sahip ContainsKey
, Add
kullanabilirsiniz, böylece vb ViewData.Add("somekey", "somevalue")
bu istisnalar atmak kalabileceğinizi unutmayın.ViewData
Görünümlerde kullanmak için TypeCasting ViewBag
gerekmiyor.İnce farkları bilmek, birini veya diğerini kullanmak çok daha fazla bir tat tercihidir.
Normalde ViewBag.AnyKey
bir takma ad düşünebilirsinizViewData["AnyKey"]
Ben de kullanmamanızı tavsiye edebilir miyim?
Verileri ekranınıza "göndermek" istiyorsanız, sınanması daha kolay olduğu için kuvvetle yazılan bir nesneyi (AKA ViewModel) gönderin.
Bir çeşit "Model" e bağlarsanız ve rastgele "viewbag" veya "viewdata" öğelerine sahipseniz, otomatik testi çok zorlaştırır.
Bunları kullanıyorsanız, nasıl yeniden yapılandırabileceğinizi ve yalnızca ViewModels'i kullanabileceğinizi düşünün.
ViewData ve ViewBag'i görünümden biraz farklı şekillerde kullanabileceğiniz anlamına gelen bazı küçük farklılıklar vardır. Bu yayında bir avantaj özetlenmiştir http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx ve dökümün örnekte ViewData yerine ViewBag kullanılarak önlenebilir.
viewdata: Görünüm ve denetleyici arasında veri depolamak için kullanılan bir sözlüktür, u veri verilerini alabilmek için görünüm veri nesnesini görünümdeki ilgili modele dökmeniz gerekir ...
ViewBag: Görünüm verilerine çalışmalarında benzer dinamik bir özelliktir, ancak görünümde kullanmadan önce corressponding modeline dökülmesine gerek olmadığı için daha iyidir ...
Aşağıda ViewData, ViewBag, TempData ve Session ile ilgili noktadan noktaya fark bulunmaktadır. Kredi / kopyalanmış askforprogram.in , Burada bahsetmediğim kod örneği için bağlantıyı izleyin.
MVC'de ViewData
MVC'de ViewBag
MVC'de TempData
MVC oturumu
Bir biçimi diğerine göre seçmede teknik bir avantajınız olmasa da, iki sözdizimi arasındaki bazı önemli farklılıkların farkında olmalısınız. Açık bir fark, ViewBag'in yalnızca eriştiğiniz anahtar geçerli bir C # tanımlayıcısı olduğunda çalışmasıdır. Örneğin, ViewData ["Boşluklarla Anahtar"] içine bir değer yerleştirirseniz, kod derlenmediğinden ViewBag kullanarak bu değere erişemezsiniz. Dikkate alınması gereken bir diğer önemli konu, dinamik değerlere uzantı yöntemlerine parametre olarak geçememenizdir. C # derleyicisi, doğru uzantı yöntemini seçmek için derleme sırasında her parametrenin gerçek türünü bilmelidir. Herhangi bir parametre dinamikse, derleme başarısız olur. Örneğin, bu kod her zaman başarısız olur: @ Html.TextBox ("ad", ViewBag.Name). Bu soruna geçici bir çözüm bulmak için <a0> </a0>, ViewData ["Name" kullanın
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
Bu şekilde, kontrolör arasındaki bilgiyi TEMP DATA ile başka bir sayfaya geçirmek için değerleri kullanmasını sağlayabiliriz
ViewData ve ViewBag arasında fark ettiğim bir ana fark:
ViewData: nesneyi döndürür ne bu atadığınız önemli değildir ve tekrar orijinal türüne yeniden tahmin etmek gerekir.
ViewBag: Basit tip (yani int, string vb.) Veya karmaşık tip atadığınız hava durumu önemli değildir.
Örn: Denetleyici kodu.
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; }
}
}
Kodu Görüntüle.
<ul>
@foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
{
<li>@item.productId @item.productName</li>
}
</ul>
Çıkış Ekranı.
Veriyi gör
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
İşte ViewData ve ViewBag gelen ikinci el pas verilerdir hem Kontrolör için Görünüm .
1. ViewData
- ViewData, ViewDataDictonary sınıfından türetilen sözlük nesnesidir .
- Veriler yalnızca bir istek için izin verir, sayfa yönlendirmesi gerçekleştiğinde ViewData değerleri temizlenir.
- ViewData değeri kullanılmadan önce cate yazılmalıdır.
Örnek: Denetleyicide
public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return View();
}
Görünümünde
@ViewData["Message"];
- ViewData ile Anahtar ve Değer gibi bir çift , Mesaj Anahtar ve ters virgül değeri Değer'dir.
- Veriler basittir, bu nedenle veriler karmaşıksa tip dökümünü burada kullanamayız.
public ActionResult PassingDatatoViewWithViewData()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewData["types"] = type;
return View();
}
- Görünümde veriler şu şekilde çıkarılabilir:
<ul>
@foreach (var items in (List<string>)ViewData["types"])
{
<li>@items</li>
}
</ul>
2. ViewBag
- ViewBag, ViewData çevresindeki dinamik özelliği kullanır.
- ViewBag'de döküm gerekir.
- ViewData ile aynı, yeniden yönlendirme gerçekleşirse değer null olur.
Misal:
public ActionResult PassingDatatoViewWithViewBag()
{
ViewData.Message = "This message shown in view with the ViewBag";
return View();
}
Görünümünde
@ViewBag.vbMessage
--Karmaşık tip için ViewBag kullanın
public ActionResult PassingDatatoViewWithViewBag()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewBag.types = type;
return View();
}
- Görünümde veriler şu şekilde çıkarılabilir:
<ul>
@foreach (var items in ViewBag.types)
{
<li>@items</li>
}
</ul>
- temel fark ViewBag'ın typecasting gerektirmediği ancak ViewData'nın typecasting gerektirmesidir.
ViewBag ve ViewData ASP.Net MVC görüntülemek için denetleyiciden bilgi aktarmak için kullanılan iki araçtır. Her iki mekanizmayı da kullanmanın amacı, denetleyici ve Görünüm arasındaki iletişimi sağlamaktır. Her ikisinin de kısa bir ömrü vardır; bu, yeniden yönlendirme gerçekleştikten sonra her ikisinin değeri null olur, yani sayfa kaynak sayfadan (ViewBag veya ViewData değerini ayarladığımız yer) hedef sayfaya yönlendirildikten sonra, ViewBag ve ViewData boş olur.
Bu benzerliklere sahip olmasına rağmen, her ikisi de (ViewBag ve ViewData) iki farklı şeydir. Farklılıklar aşağıdaki gibidir:
1.) Her iki uygulamayı da akıllıca analiz edersek ViewData'nın sözlük veri yapısı olduğunu göreceğiz - ViewDataDictionary türetilmiş ve ViewBag C # 4.0 ve dinamik bir özelliktir.
2.) ViewData formundaki değerlere erişirken, ViewData sözlüğünde Nesneler olarak depolandıkları için değerleri (veri türleri) tahmin etmemiz gerekir, ancak ViewBag durumunda bu değere erişiyor olmamız gerekmez.
3.) ViewBag'de değeri şu şekilde ayarlayabiliriz:
ViewBag.Name = "Value";
ve aşağıdaki gibi erişebilir:
@ViewBag.Name
ViewData durumunda değerler aşağıdaki gibi ayarlanabilir ve erişilebilir: ViewData'yı aşağıdaki gibi ayarlama:
ViewData["Name"] = "Value";
ve böyle bir değere erişme
@ViewData["Name"]
Daha fazla ayrıntı için buraya tıklayın: