ViewData ve ViewBag arasındaki fark nedir?


Yanıtlar:


388

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.


11
Hangi amaçla microsoft'u suçluyorsunuz? Hiçbir görünüm verisi yoksa açılır listeyi modelden nasıl bağlayabiliriz. (Modelin içinde selectlist kullanmanın iyi bir fikir olacağını sanmıyorum)
Subin Jacob

15
@SubinJacob Buna cevap vermek istiyorsanız gerçekten yeni bir soru sormalısınız. Bir SelectList oluşturmak kesinlikle bir açılır liste yapmak için gidilecek yoldur.
MiniRagnarok

25
Bence bu biraz öznel. Güçlü yazılan modeller güzel ve yada yada, ancak hızlı bir şekilde görüntülediğiniz ve çalıştığınız senaryolar için, ViewBag ve benzerleri işi Denetleyici, Görünüm, Model, AutoMapper'dan ViewModel'den daha hızlı yapar.
Craig Brett

11
@Darin, Microsoft'u bunu tanıttığı için neden "suçluyorsunuz"? Bu sadece geliştiricilere verilen bir araçtır. Ne yaptığınızı biliyorsanız, bundan en iyi şekilde yararlanabilirsiniz. Eğer beğenmezseniz veya hatalara daha yatkın gibi hissediyorsanız, kullanmayın. :)
Bilal Fazlani

5
Verileri kısmi ve düzen arasında aktarmayı nasıl önerirsiniz? İnsanlar tam resmi görmediklerinde suçluyorlar. Her yerde taban denetleyicileri ve taban görünümü modelleri veya statik / singletons nesneleri olduğunu düşünüyorum. Tahmin edin, görüntüleme verilerini kullanmayı daha iyi öğrenin ve iş için yanlış aracı kullanmakla kendinizi suçlayın.
Bart Calixto

42

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.)


Soru , hakkında ViewDatave ViewBagdeğil arasındaki farkı soruyor ViewModel.
Matthew Flaschen

Heads-up Matthew Flaschen için teşekkürler, cevap bir yazım hatası vardı ve düzelttim, şimdi bir hata olan ViewModel yerine "ViewData" okur. :)
Rich Bianco

Şimdi yanlış. İkisi de diğerine yeniden adlandırılmadı. Her ikisi de hala var. Biri dynamicve destekler ViewBag.Message. Birisi eski ViewData["Message"]sözdizimini kullanır .
Matthew Flaschen

1
+1 Ama hangi kaynaktan alıntı yapıyorsunuz ...? Gerçekten bir bağlantı sağlamalıdır.
Sam

1
Öneri için Sam teşekkür ederim. Orijinal kaynağa bir bağlantı ekledim.
Rich Bianco

34

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"]

7
cevabınız gösteriyor typecastingancak daktilo işleminin nasıl yapıldığını göstermediniz
Alex

31

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 Viewaş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>

6
anlamama yardım et ama bir hata olduğunu düşünüyorum. bu şu <h4>@ViewBag.emp.Name</h4> şekilde değişmelidir<h4>@ViewBag.Employee.Name</h4>
Benny Margalit

24

Bütün cevaplar düşündürmektedir ViewBagve / veya ViewDataveri geçmektir Controlleriç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: " ViewBagve " arasındaki fark nedirViewData nedir?"

En dikkate değer fark ViewDataGüç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?

  • ViewBaggeç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
  • ViewDatagibi bir Dictionary tüm özelliklerine sahip ContainsKey, Addkullanabilirsiniz, böylece vb ViewData.Add("somekey", "somevalue")bu istisnalar atmak kalabileceğinizi unutmayın.
  • ViewDataGörünümlerde kullanmak için TypeCasting ViewBaggerekmiyor.

İnce farkları bilmek, birini veya diğerini kullanmak çok daha fazla bir tat tercihidir.

Normalde ViewBag.AnyKeybir takma ad düşünebilirsinizViewData["AnyKey"]


14

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.


4
"Derleyici ilk birim sınamasıdır" ilkesini göz ardı etmek, statik olarak yazılan bir görünüm modeli kodunuzu dinamik bir türden daha test edilebilir hale nasıl getirir? Dinamik gereksinimi olan bir çözümde test gereksinimi daha önemli olmakla birlikte, her iki çözüm de aynı sayıda ve türde test uygularsa hiçbir şey kaybetmezsiniz.
Darren Lewis

Katılıyorum, biraz belirsiz. Belki de zekâ söz konusudur.
Joshua Ramirez

1
Bir örnek alay etmek olurdu. Bir denetleyici eylemini birim olarak test etmek istiyorsanız, bazı sözlüğe bazı dizelerin eklendiğini veya bazı dinamik alanların bazı değerlere ayarlandığını iddia etmeye çalışmak yerine, dolaşmak ve iddia etmek için bir "sahte" nesne oluşturmak daha kolaydır - birden çok parametre almak yerine bir "Talep" ve bir "Yanıt" nesnesine sahip hizmet sözleşmelerine benzer bir kavram.
nootn

Bunlardan birini kullanmazsanız, Görünüm'den Mizanpaj'a nasıl veri aktarırsınız? -1
Bart Calixto

Bu nasıl bir cevap?
JSON


6

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 ...


4

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.

  1. MVC'de ViewData

    • ViewData, ControllerBase sınıfının özelliğidir.
    • ViewData bir sözlük nesnesi türüdür.
    • ViewData, anahtar / değer içeren sözlük koleksiyonudur.
    • ViewData MVC 1.0 sürümünde tanıtıldı.
    • ViewData .Net framework 3.5 ve üstü ile çalışır.
    • Numaralandırma sırasında kodun tür dönüşümünü yapmanız gerekir.
    • ViewData nesnesi yalnızca geçerli istek için verileri tutar.
  2. MVC'de ViewBag

    • ViewBag, ControllerBase sınıfının özelliğidir.
    • ViewBag bir dinamik nesne türüdür.
    • ViewBag bir nesne türüdür.
    • ViewBag MVC 3.0 sürümünde tanıtıldı.
    • ViewBag .Net framework 4.0 ve üstü ile çalışır.
    • ViewBag özelliği kullanır ve işler, bu nedenle numaralandırma sırasında tür dönüştürme yapmaya gerek yoktur.
    • ViewBag nesnesi yalnızca geçerli istek için veri tutar.
  3. MVC'de TempData

    • TempData, ControllerBase sınıfının özelliğidir.
    • TempData bir sözlük nesnesi türüdür.
    • TempData, anahtar / değer içeren sözlük koleksiyonudur.
    • TempData MVC 1.0 sürümünde tanıtıldı.
    • TempData .Net framework 3.5 ve üstü ile çalışır.
    • Numaralandırma sırasında kodun tür dönüşümünü yapmanız gerekir.
    • TempData nesnesi, geçerli istek ile sonraki istek arasında veri oluşturmak için kullanılır.
  4. MVC oturumu

    • Oturum Denetleyicinin (Soyut Sınıf) mülkiyetindedir.
    • Oturum bir HttpSessionStateBase türüdür.
    • Oturum, anahtar / değer içeren sözlük koleksiyonudur.
    • Oturum MVC 1.0 sürümünde tanıtıldı.
    • TempData .Net framework 1.0 ve üstü ile çalışır.
    • Numaralandırma sırasında kodun tür dönüşümünü yapmanız gerekir.
    • Oturum nesnesi tüm istekler için veri tutar. Tüm istekler için geçerlidir, süresi asla dolmaz.

1

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


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"] 

0

Bu şekilde, kontrolör arasındaki bilgiyi TEMP DATA ile başka bir sayfaya geçirmek için değerleri kullanmasını sağlayabiliriz


0

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 &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Çıkış Ekranı.

resim açıklamasını buraya girin


0

Veriyi gör

  1. ViewData denetleyiciden verileri görüntülemek için kullanılır
  2. ViewData ViewDataDictionary sınıfından türetilir ve temelde bir Sözlük nesnesi ieKeys ve Değerler nerede Keys Dize iken Değerler nesne olacak.
  3. Veri türü, Nesne türü veri ve ayrıca tür dökümü için boş değer denetimi nedeniyle ViewData'dan veri alınırken gereklidir, aksi takdirde uygulamayı bozacaktır. Yeniden yönlendirme gerçekleşirse değeri boş olur TempData ViewData ve View Bag arasındaki tam farkı oku

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


0
Veriyi gör
  1. ViewData denetleyiciden verileri görüntülemek için kullanılır
  2. ViewDataDictionary sınıfından türetilmiştir
  3. Yalnızca mevcut istek için kullanılabilir
  4. Karmaşık veri türü için yazım gerektirir ve hatayı önlemek için null değerleri kontrol eder
  5. Yeniden yönlendirme olursa, değeri null olur
ViewBag
  1. ViewBag ayrıca denetleyiciden ilgili görünüme veri aktarmak için kullanılır
  2. ViewBag, C # 4.0'daki yeni dinamik özelliklerden yararlanan dinamik bir özelliktir
  3. Yalnızca mevcut istek için de kullanılabilir
  4. Yeniden yönlendirme olursa, değeri null olur
  5. Karmaşık veri türü için yazım gerektirmez

0

İş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.


-1

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:


2
üzgünüm indirmedim ama bu cevap yararlı bir şey söylemek için birkaç paragraf alır. Kabul edilen cevapta eksik olan yararlı şey, rachelappel.com/… '
Chris F Carroll
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.