Cara kerja ViewBag di ASP.NET MVC


102

Bagaimana cara kerja ASP.NET MVC ViewBag? MSDN mengatakan itu hanya Object, yang membuat saya penasaran, bagaimana sifat "Sihir" seperti ViewBag.Foodan string ajaibViewBag["Hello"] bekerja?

Selain itu, bagaimana cara membuatnya dan menggunakannya di aplikasi ASP.NET WebForms?

Contoh akan sangat dihargai!


Konsep ini tampaknya tidak diperlukan di WebForms karena halaman sudah memiliki akses langsung ke variabel dalam kode di belakang file. Sedangkan di MVC tampilan tidak memiliki akses ke apa pun di pengontrol selain dari data yang diteruskan dalam tampilan ViewBag atau Model.
Richard Dalton

Jawaban:


91

ViewBagadalah tipe dynamictetapi, secara internal sebuahSystem.Dynamic.ExpandoObject()

Ini dinyatakan seperti ini:

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

itulah mengapa Anda bisa melakukan:

ViewBag.Foo = "Bar";

Contoh Kode Objek Expander:

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
Aneh bahwa itu hanya mengatakan public object ViewBag { get; }pada halaman MSDN untuk ViewBag , tapi aku membeli klaim Anda bahwa itu sebuahExpandoObject . Saya suka perbandingan dengan ViewData di sini : " Jadi pada dasarnya [ViewBag] menggantikan string ajaib [di ViewData] ... dengan properti ajaib ". ; ^)
ruffin

@ruffin anehnya aneh yang dikatakan public object ViewBag { get; }di MSDN, Kode mengatakan itu dynamic ViewBag { get .. yang secara internal adalah tipe DynamicViewData
Aniket Inge

Sangat bagus . Terima kasih telah menggali itu. Dan saya memberi +1 & mengatakan bahwa saya percaya Anda! ; ^)
ruffin

2
@ruffin kasus lain ketika dokumentasi berbohong dan kode tidak pernah berbohong
Aniket Inge

Terkadang saya terkesan ketika menemukan jawaban yang benar untuk pertanyaan yang tidak terlalu jelas / campur aduk. Terima kasih!
Oscar Ortiz

33

Ini adalah objek dinamis, artinya Anda dapat menambahkan properti ke dalamnya di pengontrol, dan membacanya nanti dalam tampilan, karena pada dasarnya Anda membuat objek seperti yang Anda lakukan, fitur tipe dinamis. Lihat artikel MSDN ini tentang dinamika. Lihat artikel ini ini tentang penggunaannya dalam kaitannya dengan MVC.

Jika Anda ingin menggunakan ini untuk formulir web, tambahkan properti dinamis ke kelas halaman dasar seperti:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Minta semua halaman Anda mewarisi dari ini. Anda harus dapat, dalam markup ASP.NET, melakukan:

<%= ViewBagProperty.X %>

Seharusnya itu berhasil. Jika tidak, ada cara untuk mengatasinya.


Saya tahu apa itu ViewBag, saya ingin tahu cara membuat objek seperti itu di WebForms, yang berarti saya ingin membuat kode sendiri.
Aniket Inge

Diperbarui di atas dengan implementasi.
Brian Mains

8

The ViewBagadalah System.Dynamic.ExpandoObjectseperti yang disarankan. Properti dalam pada ViewBagdasarnya adalah KeyValueberpasangan, di mana Anda mengakses nilai dengan kunci. Dalam pengertian ini ini setara:

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

Saya tahu apa itu ViewBag, saya ingin tahu cara membuat objek seperti itu di WebForms, yang berarti saya ingin membuat kode sendiri.
Aniket Inge

@Aniket Anda memiliki Kondisi Tampilan dalam formulir web.
Konstantin Dinev

5

ViewBag digunakan untuk meneruskan data dari Controller Action ke view untuk merender data yang diteruskan. Sekarang Anda bisa meneruskan data menggunakan antara Controller Action dan View baik dengan menggunakan ViewBag atau ViewData. ViewBag: Ini adalah jenis objek Dinamis, yang berarti Anda dapat menambahkan kolom baru ke viewbag secara dinamis dan mengakses kolom ini di Tampilan. Anda perlu menginisialisasi objek viewbag pada saat membuat kolom baru.

misal: 1. Membuat ViewBag: ViewBag.FirstName = "John";

  1. Mengakses View: @ ViewBag.FirstName.

3

ViewBag adalah tipe dinamis. Lebih dari itu, Anda tidak dapat melakukannya ViewBag["Foo"]. Anda akan mendapatkan pengecualian - Tidak dapat menerapkan pengindeksan dengan [] ke ekspresi jenis 'System.Dynamic.DynamicObject' .

Implementasi internal ViewBagsebenarnya menyimpan Foo ke dalam ViewData["Foo"](jenis ViewDataDictionary), sehingga keduanya dapat dipertukarkan. ViewData["Foo"]danViewBag.Foo .

Dan ruang lingkup. ViewBag dan ViewData adalah ment untuk meneruskan data antara Tindakan Pengontrol dan View yang direndernya.


0

ViewBag adalah tipe dinamis yang memungkinkan Anda menyetel atau mendapatkan nilai secara dinamis dan memungkinkan Anda menambahkan sejumlah bidang tambahan tanpa kelas yang diketik dengan kuat. Mereka memungkinkan Anda untuk meneruskan data dari pengontrol ke tampilan. Dalam pengontrol ......

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

Dalam penglihatan

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

Apa yang saya pelajari adalah bahwa keduanya harus memiliki properti save dynamic name yaitu ViewBag.victor


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

        return _viewBag;
    }
}

3
Saya meminta Anda untuk menambahkan beberapa konteks / komentar di sekitar kode yang telah Anda bagikan. Ini akan membantu penanya dan pembaca masa depan lainnya untuk memahami posting Anda dengan lebih baik.
RBT
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.