ASP.NET MVC'de ViewBag nasıl çalışır?


102

ASP.NET MVC nasıl ViewBagçalışır? MSDN, bunun sadece bir olduğunu söylüyor Object, ilgimi çekiyor, ViewBag.Foosihirli dizeler gibi "Büyü" özellikleri ViewBag["Hello"]gerçekte nasıl çalışıyor?

Ayrıca, nasıl bir tane oluşturup ASP.NET WebForms uygulamamda bunu nasıl kullanabilirim?

Örnekler gerçekten takdir edilecektir!


Sayfa zaten dosyanın arkasındaki koddaki değişkenlere doğrudan erişime sahip olduğundan, WebForms'ta bu konsepte ihtiyaç duyulmuyor. MVC'de görünüm, ViewBag veya Model görünümünde iletilen veriler dışında denetleyicideki hiçbir şeye erişemez.
Richard Dalton

Yanıtlar:


91

ViewBagtipidir dynamicancak dahili olarak birSystem.Dynamic.ExpandoObject()

Şöyle ilan edilir:

dynamic ViewBag = new System.Dynamic.ExpandoObject();

bu yüzden yapabilirsiniz:

ViewBag.Foo = "Bar";

Örnek Bir Genişletici Nesne Kodu:

public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider
{
    public Dictionary<string, object> objectDictionary;

    public ExpanderObject()
    {
        objectDictionary = new Dictionary<string, object>();
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        object val;
        if (objectDictionary.TryGetValue(binder.Name, out val))
        {
            result = val;
            return true;
        }
        result = null;
        return false;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        try
        {
            objectDictionary[binder.Name] = value;
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

1
Garip olduğunu sadece diyor public object ViewBag { get; }ViewBag için MSDN sayfasından , ama olduğunu iddianızı satın alıyorum birExpandoObject . Buradaki ViewData ile karşılaştırmayı seviyorum : " Yani [ViewBag], [ViewData'daki] sihirli dizeleri sihirli özelliklerle değiştiriyor ... ". ; ^)
2016

@ruffin public object ViewBag { get; }, MSDN'de söylediği garip bir şekilde tuhaf , Code dynamic ViewBag { get .. bunun dahili olarak DynamicViewData
Aniket Inge

Çok güzel . Bunu araştırdığınız için teşekkürler. Ve +1 yaptım ve sana inandığımı söyledim! ; ^)
2016

2
@ruffin, belgelerin yalan
söylediği

Bazen çok net olmayan / karışık olmayan sorularda doğru cevapları bulduğumda etkileniyorum. Teşekkürler!
Oscar Ortiz

33

Bu dinamik bir nesnedir, yani denetleyicide ona özellikler ekleyebilir ve bunları daha sonra görünümde okuyabilirsiniz, çünkü aslında nesneyi yaptığınız gibi, dinamik tipte bir özellik oluşturuyorsunuz. Dinamikler hakkındaki bu MSDN makalesine bakın . MVC ile ilgili olarak kullanımı hakkındaki bu makaleye bakın .

Bunu web formları için kullanmak istiyorsanız, aşağıdaki gibi bir temel sayfa sınıfına dinamik bir özellik ekleyin:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Tüm sayfalarınız bundan miras alın. ASP.NET işaretlemenizde şunları yapabilmeniz gerekir:

<%= ViewBagProperty.X %>

Bu çalışmalı. Değilse, bunun etrafında çalışmanın yolları vardır.


ViewBag'in ne olduğunu biliyorum, WebForms'da böyle bir nesneyi nasıl yapacağımı bilmek istiyorum, yani onu elle kodlamak istiyorum.
Aniket Inge

Yukarıda bir uygulama ile güncellendi.
Brian Mains

8

ViewBagBir olduğu System.Dynamic.ExpandoObjectkadar önerdi. İçindeki özellikler , değere anahtarla eriştiğiniz ViewBagtemelde KeyValueçiftlerdir. Bu anlamda bunlar eşdeğerdir:

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";

ViewBag'in ne olduğunu biliyorum, WebForms'da böyle bir nesneyi nasıl yapacağımı bilmek istiyorum, yani onu elle kodlamak istiyorum.
Aniket Inge

@Aniket Web formlarında bir ViewState'e sahipsiniz.
Konstantin Dinev

5

ViewBag, iletilen verileri işlemek için Denetleyici Eyleminden veri iletmek için kullanılır. Artık, ViewBag veya ViewData kullanarak Controller Action ile View arasında veri aktarabilirsiniz. ViewBag: Dinamik nesne türüdür, yani Viewbag'e dinamik olarak yeni alanlar ekleyebilir ve bu alanlara View'de erişebilirsiniz. Yeni alanlar yaratırken viewbag nesnesini başlatmanız gerekir.

örneğin: 1. ViewBag Oluşturma: ViewBag.FirstName = "John";

  1. Görünüme Erişim: @ ViewBag.FirstName.

3

ViewBag dinamik tiptedir. Daha fazlasını yapamazsınız ViewBag["Foo"]. İstisna elde edeceksiniz - 'System.Dynamic.DynamicObject' türündeki bir ifadeye [] ile indeksleme uygulanamaz. .

Dahili gerçekleme, Foo'yu (ViewDataDictionary türü) ViewBagiçine depolar ViewData["Foo"], bu nedenle bu ikisi birbirinin yerine kullanılabilir. ViewData["Foo"]ve ViewBag.Foo.

Ve kapsam. ViewBag ve ViewData, Denetleyicinin Eylemleri ve Oluşturduğu Görünüm arasında veri iletir.


0

ViewBag, değerleri dinamik olarak ayarlamanıza veya almanıza ve güçlü bir şekilde yazılmış bir sınıf olmadan istediğiniz sayıda ek alan eklemenize izin veren dinamik bir türdür. Denetleyicide ......

public ActionResult Index()
{
    ViewBag.victor = "My name is Victor";
    return View();
}

Görünümünde

@foreach(string a in ViewBag.victor)
{
     .........
}

Öğrendiğim şey, her ikisinin de kaydetme dinamik ad özelliğine sahip olması gerektiğidir, yani ViewBag.victor


-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}

3
Sizden paylaştığınız kodun etrafına biraz bağlam / yorum eklemenizi rica ediyorum. Soruyu soranın ve gelecekteki diğer okuyucuların gönderinizi daha iyi anlamalarına yardımcı olacaktır.
RBT
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.