ViewBag ใน ASP.NET MVC ทำงานอย่างไร


102

ASP.NET MVC ViewBagทำงานอย่างไร MSDN กล่าวว่ามันเป็นเพียงสิ่งObjectที่ทำให้ฉันสนใจคุณสมบัติของ "เวทมนตร์" เช่นViewBag.Fooและสายเวทย์ViewBag["Hello"]ทำงานได้จริงอย่างไร

นอกจากนี้ฉันจะสร้างและใช้งานในแอป ASP.NET WebForms ได้อย่างไร

ตัวอย่างน่าชื่นชมจริงๆ!


ดูเหมือนจะไม่จำเป็นต้องใช้แนวคิดนี้ใน WebForms เนื่องจากหน้าเว็บมีการเข้าถึงตัวแปรโดยตรงในโค้ดที่อยู่เบื้องหลังไฟล์อยู่แล้ว ในขณะที่ใน MVC มุมมองไม่สามารถเข้าถึงสิ่งใดในคอนโทรลเลอร์ได้นอกเหนือจากข้อมูลที่ส่งผ่านในมุมมอง ViewBag หรือ Model
Richard Dalton

คำตอบ:


91

ViewBagเป็นประเภทdynamicแต่ภายในเป็นไฟล์System.Dynamic.ExpandoObject()

มีการประกาศดังนี้:

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

ซึ่งเป็นเหตุผลที่คุณสามารถทำได้:

ViewBag.Foo = "Bar";

ตัวอย่างรหัสวัตถุ 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
แปลกที่มันบอกpublic object ViewBag { get; }ในหน้า MSDN สำหรับ ViewBagแต่ฉันซื้อการอ้างสิทธิ์ของคุณว่าเป็นExpandoObjectไฟล์. ฉันชอบการเปรียบเทียบกับ ViewData ที่นี่ : " โดยพื้นฐานแล้ว [ViewBag] จะแทนที่สายเวทย์ [ใน ViewData] ... ด้วยคุณสมบัติวิเศษ " ; ^)
ruffin

@ruffin แปลก ๆ ที่มันพูดpublic object ViewBag { get; }ใน MSDN โค้ดบอกว่าdynamic ViewBag { get .. ภายในเป็นประเภทDynamicViewData
Aniket Inge

ดีมาก . ขอบคุณที่ขุดขึ้นมา และฉันได้ +1 และบอกว่าฉันเชื่อคุณ! ; ^)
ruffin

2
@ruffin อีกกรณีหนึ่งเมื่อเอกสารอยู่และรหัสไม่เคยโกหก
Aniket Inge

บางครั้งฉันก็ประทับใจเมื่อพบคำตอบที่ถูกต้องสำหรับคำถามที่ไม่ชัดเจน / หลากหลาย ขอบคุณ!
Oscar Ortiz

33

เป็นวัตถุแบบไดนามิกซึ่งหมายความว่าคุณสามารถเพิ่มคุณสมบัติลงในตัวควบคุมและอ่านได้ในภายหลังในมุมมองเนื่องจากคุณกำลังสร้างวัตถุตามที่คุณทำซึ่งเป็นคุณลักษณะของประเภทไดนามิก ดูบทความ MSDNเกี่ยวกับพลวัต ดู บทความนี้เกี่ยวกับการใช้งานที่เกี่ยวข้องกับ MVC

หากคุณต้องการใช้สิ่งนี้สำหรับเว็บฟอร์มให้เพิ่มคุณสมบัติไดนามิกลงในคลาสของเพจพื้นฐานดังนี้:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

ให้เพจทั้งหมดของคุณสืบทอดมาจากสิ่งนี้ คุณควรจะสามารถทำได้ในมาร์กอัป ASP.NET ของคุณ:

<%= ViewBagProperty.X %>

ที่ควรจะทำงาน ถ้าไม่เป็นเช่นนั้นมีวิธีการแก้ไข


ฉันรู้ว่า ViewBag คืออะไรฉันอยากรู้วิธีสร้างวัตถุแบบนั้นใน WebForms ซึ่งหมายความว่าฉันต้องการเขียนโค้ดด้วยมือ
Aniket Inge

อัปเดตด้านบนด้วยการใช้งาน
Brian Mains

8

ViewBagเป็นSystem.Dynamic.ExpandoObjectตามที่แนะนำ คุณสมบัติในViewBagเป็นKeyValueคู่ที่คุณเข้าถึงค่าด้วยคีย์ ในแง่นี้สิ่งเหล่านี้เทียบเท่า:

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

ฉันรู้ว่า ViewBag คืออะไรฉันอยากรู้วิธีสร้างวัตถุแบบนั้นใน WebForms ซึ่งหมายความว่าฉันต้องการเขียนโค้ดด้วยมือ
Aniket Inge

@Aniket คุณมี ViewState ในรูปแบบเว็บ
Konstantin Dinev

5

ViewBag ใช้เพื่อส่งผ่านข้อมูลจาก Controller Action เพื่อดูเพื่อแสดงผลข้อมูลที่ส่งผ่าน ตอนนี้คุณสามารถส่งผ่านข้อมูลโดยใช้ระหว่าง Controller Action และ View โดยใช้ ViewBag หรือ ViewData ViewBag: เป็นประเภทของวัตถุไดนามิกซึ่งหมายความว่าคุณสามารถเพิ่มฟิลด์ใหม่ให้กับ viewbag แบบไดนามิกและเข้าถึงฟิลด์เหล่านี้ในมุมมอง คุณต้องเริ่มต้นวัตถุของวิวแบ็กในเวลาที่สร้างฟิลด์ใหม่

เช่น 1. การสร้าง ViewBag: ViewBag.FirstName = "John";

  1. การเข้าถึง View: @ ViewBag.FirstName

3

ViewBag เป็นประเภทไดนามิก ViewBag["Foo"]เพิ่มเติมคุณไม่สามารถทำ คุณจะได้รับข้อยกเว้น - ไม่สามารถใช้การจัดทำดัชนีด้วย [] เพื่อการแสดงออกของชนิด 'System.Dynamic.DynamicObject'

การใช้งานภายในของการจัดViewBagเก็บ Foo ไว้ในViewData["Foo"](ประเภทของ ViewDataDictionary) ดังนั้น 2 สิ่งนี้จึงใช้แทนกันได้ ViewData["Foo"]และViewBag.Foo.

และขอบเขต. ViewBag และ ViewData เป็นข้อมูลที่ส่งผ่านข้อมูลระหว่างการดำเนินการของคอนโทรลเลอร์และ View it renders


0

ViewBag เป็นประเภทไดนามิกที่อนุญาตให้คุณตั้งค่าหรือรับค่าแบบไดนามิกและอนุญาตให้คุณเพิ่มฟิลด์เพิ่มเติมจำนวนเท่าใดก็ได้โดยไม่ต้องมีคลาสที่พิมพ์มากเกินไปซึ่งอนุญาตให้คุณส่งข้อมูลจากคอนโทรลเลอร์ไปยังมุมมอง ในคอนโทรลเลอร์ ......

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

ในมุมมอง

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

สิ่งที่ฉันได้เรียนรู้คือทั้งสองควรมีคุณสมบัติบันทึกชื่อไดนามิกคือ ViewBag.victor


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

        return _viewBag;
    }
}

3
ฉันขอให้คุณโปรดเพิ่มบริบท / ความคิดเห็นเกี่ยวกับรหัสที่คุณแชร์ จะช่วยให้ผู้ถามและผู้อ่านคนอื่น ๆ ในอนาคตเข้าใจโพสต์ของคุณได้ดีขึ้น
RBT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.