2013-02-15 27 views
87

एएसपी.नेट एमवीसी के ViewBag काम कैसे करता है? एमएसडीएन का कहना है कि यह सिर्फ Object है, जो मुझे साजिश देता है, ViewBag.Foo जैसे मैजिक "गुण" और जादू तार ViewBag["Hello"] वास्तव में कैसे काम करता है?एएसपी.नेट एमवीसी में व्यूबैग कैसे काम करता है

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

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

+0

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

उत्तर

76

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

अजीब है कि [यह सिर्फ 'सार्वजनिक वस्तु ViewBag {मिलता है; } 'व्यूबैग के लिए एमएसडीएन पेज पर] (https://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.viewbag (v = vs.118) .aspx), लेकिन मैं हूं अपने दावे को खरीदना कि यह [एक 'ExpandoObject'] है (https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject (v = vs.110) .aspx)। मुझे [व्यूडाटा के साथ तुलना] पसंद है [http://stackoverflow.com/a/4705446/1028230): "* तो मूल रूप से [व्यूबैग] जादू के गुणों के साथ [दृश्य डेटा] में जादू तारों को बदलता है *"। ; ^) – ruffin

+0

@ruffin अजीब अजीब बात है कि यह कहता है 'सार्वजनिक वस्तु ViewBag {प्राप्त करें; } 'एमएसडीएन पर, कोड कहता है कि यह ['गतिशील व्यूबैग {प्राप्त करें ..'] (https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs) आंतरिक रूप से प्रकार [DynamicViewData] है (https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DynamicViewData.cs) –

+0

[बहुत अच्छा] (https: // github.com/aspnet/Mvc/blob/8b1bd343ba56152d2a7e677cf041dc9d62b4033f/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs#L84)। इसे खोदने के लिए धन्यवाद। और मैंने +1 किया और कहा कि मैं तुम पर विश्वास करता हूँ! ; ^) – ruffin

5

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

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

मुझे पता है कि व्यूबैग क्या है, मैं जानना चाहता हूं कि वेबफॉर्म में ऐसा ऑब्जेक्ट कैसे बनाना है, जिसका अर्थ है कि मैं इसे कोड-कोड करना चाहता हूं। –

+0

@ एनीनेट आपके पास वेब रूपों में व्यूस्टेट है। –

32

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

आप वेब प्रपत्रों के लिए इसका उपयोग करने के लिए है, तो जैसे एक आधार पेज वर्ग के लिए एक गतिशील संपत्ति जोड़ने के लिए चाहते थे, तो:

public class BasePage : Page 
{ 

    public dynamic ViewBagProperty 
    { 
     get; 
     set; 
    } 
} 

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

<%= ViewBagProperty.X %> 

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

+0

मुझे पता है कि व्यूबैग क्या है, मैं जानना चाहता हूं कि वेबफॉर्म में ऐसा ऑब्जेक्ट कैसे बनाना है, जिसका अर्थ है कि मैं इसे हाथ-कोड करना चाहता हूं। –

+0

एक कार्यान्वयन के साथ ऊपर अद्यतन किया गया। –

2

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

ViewBag का आंतरिक कार्यान्वयन वास्तव में ViewData["Foo"] (ViewDataDictionary का प्रकार) में Foo स्टोर करता है, इसलिए वे 2 अदला-बदले में हैं। ViewData["Foo"] और ViewBag.Foo

और दायरा। व्यूबैग और व्यूडाटा नियंत्रक की कार्रवाइयों के बीच डेटा पास करने और इसे प्रस्तुत करने के लिए मानसिक हैं।

4

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

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

  1. एक्सेसिंग दृश्य: @ व्यूबैग। फर्स्टनाम।
-1
public dynamic ViewBag 
{ 
    get 
    { 
     if (_viewBag == null) 
     { 
      _viewBag = new DynamicViewData(() => ViewData); 
     } 

     return _viewBag; 
    } 
} 
+2

झूठ नहीं बोलता है, मैं आपको आपके द्वारा साझा किए गए कोड के आस-पास कुछ संदर्भ/टिप्पणी जोड़ने का अनुरोध करता हूं। यह पूछताछ करने वाले और अन्य भावी पाठकों को आपकी पोस्ट को बेहतर ढंग से समझने में मदद करेगा। – RBT

0

ViewBag एक गतिशील प्रकार आप गतिशील रूप से सेट या मान मिलता है और आप एक जोरदार टाइप वर्ग वे आपको देखने के लिए नियंत्रक से डेटा से गुजरने की अनुमति के बिना अतिरिक्त फ़ील्ड के किसी भी संख्या को जोड़ने के लिए अनुमति देने के लिए अनुमति देते हैं वह यह है कि । नियंत्रक में ......

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

ध्यान में रखते हुए

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

क्या मैं सीख लिया है कि दोनों को बचाने के गतिशील नाम संपत्ति यानी ViewBag.victor