ASP.NET MVC में ViewBag कैसे काम करता है


102

ASP.NET MVC कैसे काम करता है ViewBag? MSDN का कहना है कि यह सिर्फ एक है Object, जो मुझे साज़िश करता है, "मैजिक" गुण जैसे कि ViewBag.Fooऔर मैजिक स्ट्रिंग्स ViewBag["Hello"]वास्तव में कैसे काम करते हैं?

इसके अलावा, मैं अपने ASP.NET WebForms ऐप में एक कैसे बना सकता हूं और इसका उपयोग कैसे कर सकता हूं?

उदाहरण वास्तव में सराहना की जाएगी!


वेबफार्म में अवधारणा की आवश्यकता प्रतीत नहीं होती है क्योंकि पृष्ठ में फ़ाइल के पीछे कोड में चर तक सीधे पहुंच है। जबकि एमवीसी में व्यूबाग या मॉडल को ध्यान में रखते हुए डेटा के अलावा कंट्रोलर में कुछ भी एक्सेस नहीं होता है।
रिचर्ड डेल्टन

जवाबों:


91

ViewBagप्रकार का है dynamicलेकिन, आंतरिक रूप से एक हैSystem.Dynamic.ExpandoObject()

इसे इस तरह घोषित किया जाता है:

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

आप ऐसा क्यों कर सकते हैं:

ViewBag.Foo = "Bar";

एक नमूना विस्तारक वस्तु कोड:

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; }ViewBag के लिए MSDN पृष्ठ पर कहता है , लेकिन मैं आपका दावा खरीद रहा हूं कि यह एक हैExpandoObject । मुझे यहाँ ViewData के साथ तुलना पसंद है : " तो मूल रूप से [ViewBag] जादू के तार [ViewData] में ... जादुई गुणों के साथ " प्रतिस्थापित करता है । ; ^)
रफिन

@ruffin अजीब तरह से अजीब है कि यह public object ViewBag { get; }MSDN पर कहता है, कोड का कहना है कि यह dynamic ViewBag { get .. आंतरिक रूप से डायनामिक व्यूडेटा का है
Aniket Inge

बहुत अच्छा । उस को खोदने के लिए धन्यवाद। और मैंने +1 किया और कहा कि मुझे आप पर विश्वास है! ; ^)
रफिन

2
@ruffin का एक और मामला जब दस्तावेज़ झूठ है और कोड कभी झूठ नहीं बोलता है
अनिकेत इंग

कभी-कभी स्पष्ट / मिश्रित प्रश्नों पर सही उत्तर नहीं मिलने पर मैं प्रभावित हो जाता हूं। धन्यवाद!
ऑस्कर ऑर्टिज़

33

यह एक गतिशील वस्तु है, जिसका अर्थ है कि आप इसे नियंत्रक में गुण जोड़ सकते हैं, और बाद में उन्हें दृश्य में पढ़ सकते हैं, क्योंकि आप अनिवार्य रूप से ऑब्जेक्ट बना रहे हैं जैसा कि आप करते हैं, गतिशील प्रकार की एक विशेषता। यह देखोडायनामिक्स पर MSDN आलेखइस लेख को देखें एमवीसी के संबंध में इसका उपयोग।

यदि आप वेब फ़ॉर्म के लिए इसका उपयोग करना चाहते हैं, तो बेस पेज की तरह एक डायनेमिक प्रॉपर्टी जोड़ें जैसे:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

क्या आपके सभी पृष्ठ इस से विरासत में मिले हैं। आपको अपने ASP.NET मार्कअप में सक्षम होना चाहिए, करें:

<%= ViewBagProperty.X %>

वह काम करना चाहिए। यदि नहीं, तो इसके आसपास काम करने के तरीके हैं।


मुझे पता है कि ViewBag क्या है, मैं जानना चाहता हूं कि WebForms में उस तरह का ऑब्जेक्ट कैसे बनाया जाता है, जिसका मतलब है कि मैं इसे हाथ से कोड करना चाहता हूं।
अनिकेत इंग

एक कार्यान्वयन के साथ ऊपर अद्यतन।
ब्रायन मेन्स

8

ViewBagएक है System.Dynamic.ExpandoObjectके रूप में सुझाव दिया। गुण ViewBagअनिवार्य रूप से KeyValueजोड़े हैं, जहां आप कुंजी द्वारा मूल्य तक पहुंचते हैं। इस अर्थ में ये समतुल्य हैं:

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

मुझे पता है कि ViewBag क्या है, मैं जानना चाहता हूं कि WebForms में उस तरह का ऑब्जेक्ट कैसे बनाया जाता है, जिसका मतलब है कि मैं इसे हाथ से कोड करना चाहता हूं।
अनिकेत इंग

@Aniket आपके पास वेब रूपों में एक ViewState है।
कॉन्स्टेंटिन दिनेव

5

ViewBag का उपयोग कंट्रोलर एक्शन से डेटा पास करने के लिए किया जाता है ताकि जो डेटा पास किया जा रहा है उसे रेंडर किया जा सके। अब आप कंट्रोलर एक्शन और व्यू के बीच व्यूबाग या व्यूडाटा का उपयोग करके डेटा पास कर सकते हैं। ViewBag: यह डायनामिक ऑब्जेक्ट का प्रकार है, इसका मतलब है कि आप गतिशील रूप से व्यूबैग में नए फ़ील्ड जोड़ सकते हैं और इन फ़ील्ड्स को व्यू में एक्सेस कर सकते हैं। नए फ़ील्ड बनाते समय आपको व्यूबैग की ऑब्जेक्ट को इनिशियलाइज़ करना होगा।

उदाहरण: 1. व्यूबाग बनाना: व्यूबाग.फर्स्टनेम = "जॉन";

  1. एक्सेसिंग व्यू: @ ViewBag.FirstName।

3

ViewBag टाइप डायनेमिक है। अधिक, आप ऐसा नहीं कर सकते ViewBag["Foo"]। आपको अपवाद मिलेगा - 'System.Dynamic.DynamicObject' प्रकार की अभिव्यक्ति के लिए [] के साथ अनुक्रमण लागू नहीं किया जा सकता है

आंतरिक कार्यान्वयन ViewBagवास्तव में फू को ViewData["Foo"](व्यूडेटा के प्रकार) में संग्रहीत करता है , इसलिए वे 2 विनिमेय हैं। ViewData["Foo"]और ViewBag.Foo

और गुंजाइश है। ViewBag और ViewData कंट्रोलर के कार्यों के बीच डेटा पास करने और इसे रेंडर करने के लिए देखने के लिए मानसिक हैं।


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.