2012-02-08 7 views
34

मैंने व्यूबैग/व्यूडाटा बनाम व्यूमोडेल का उपयोग करने के बारे में कई पोस्ट देखी हैं लेकिन मुझे व्यूबैग के जीवन चक्र का स्पष्टीकरण नहीं मिला है।व्यूबैग/व्यूडाटा लाइफसाइक्ल

// POST: /MyModel/Edit/5 
[HttpPost] 
public ActionResult Edit(MyModel _mymodel){} 

और

// GET: /MyModel/Edit/5 
public ActionResult Edit(int id){} 

तो मैं कार्रवाई विधि में ViewBag में कुछ मान रखा है, किसी न किसी रूप स्थापित करने के लिए:

उदाहरण के लिए, मैं एक नियंत्रक में दो कार्रवाई तरीकों लेबल, तब जब वे उपयोगकर्ता 'सबमिट' बटन पर क्लिक करते हैं और फॉर्म HTTP पोस्ट के माध्यम से सर्वर पर वापस पोस्ट किया जाता है, तो व्यूबैग मान अब POST एक्शन विधि के भीतर नहीं होते हैं।

क्या कोई व्यक्ति कृपया व्यूबैग/व्यूडाटा के जीवन चक्र को समझा सकता है (या अच्छे लेख का संदर्भ प्रदान कर सकता है)?

उत्तर

35

आपके द्वारा व्यूबैग/व्यूडाटा में डाला गया डेटा केवल उस अनुरोध के जीवन चक्र के दौरान उपलब्ध है जिसमें आपने इसे पॉप्युलेट किया था। एमवीसी में पोस्ट बैक नहीं है। यदि आपको एक से अधिक अनुरोधों पर बने रहने के लिए कुछ चाहिए, तो आपको सत्र का उपयोग करना चाहिए। गतिशील दृश्य डेटा शब्दकोश, ViewData: दृश्य डेटा के लिए शब्दकोश - ViewBag http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

+0

उत्तर के लिए धन्यवाद। मैंने उस लेख को पढ़ा था और यह व्यूबैग/व्यूडाटा के जीवन चक्र पर छूता नहीं है लेकिन टेम्पैडाटा पर थोड़ा सा करता है। 'पोस्ट बैक' द्वारा चीजों को साफ़ करने के लिए, मेरा मतलब था कि उपयोगकर्ता एक फॉर्म सबमिट करता है जिससे HTTP पोस्ट अनुरोध होता है, जो तब नियंत्रक उचित क्रिया विधि द्वारा संभाला जाता है। – JTech

+1

आलेख बताता है "हालांकि, एक बार नियंत्रक रीडायरेक्ट हो जाने पर, व्यूबैग और व्यूडाटा में शून्य मान होंगे।" सही है, वह विशेष रूप से यह नहीं कहती है कि अनुरोध पूरा होने के बाद व्यूबैग और व्यूडाटा का जीवन-चक्र समाप्त होता है, लेकिन वह इसका मतलब बताती है। –

2

MSDN से:

यहाँ ViewData, ViewBag, और TempData के बीच मतभेदों के बारे में एक सभ्य लेख है।

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

0

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

  • ViewData: ViewData वस्तुओं की एक शब्दकोश है और वे कुंजी के रूप में स्ट्रिंग से सुलभ हैं।
  • ViewBag: गतिशील सुविधा का उपयोग करता है। यह किसी ऑब्जेक्ट को गतिशील गुण जोड़ने की अनुमति देता है।
+0

यह सच नहीं है। आपको लगता है कि 2 क्यों हैं? व्यूबैग दृश्य के लिए एक गतिशील प्रॉपर्टी बैग है, जैसे पेज शीर्षक, स्थानीयकरण डेटा, जैसे लेबल और यदि आपका कंट्रोलर एक्शन, वेब/मोबाइल इत्यादि जैसे अलग-अलग विचार प्रस्तुत करता है और उपयोगकर्ताओं को भाषा स्विच करनी चाहिए। व्यूडाटा मॉडल है, डेटा को डेटा के साथ पृष्ठ को पॉप्युलेट करने के लिए डेटा को पारित किया जा रहा है, जैसे मूल्यों के साथ इनपुट नियंत्रण पॉप्युलेट करना, या कुछ उपयोगकर्ता प्रतिक्रिया डेटा। –

7

यहां स्वीकृत उत्तर वास्तव में व्यूबैग/व्यूडाटा के जीवन चक्र का वर्णन नहीं करता है। यह दुर्भाग्यपूर्ण है कि इस बारे में कोई स्पष्ट दस्तावेज नहीं दिखता है। हालांकि, इस पर आधारित

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

यह प्रतीत होता है जीवन चक्र है:

आईआईएस अनुरोध -> रूटिंग -> MVC हैंडलर -> (ViewData के साथ) नियंत्रक -> (ViewData के साथ) देखें - > निपटान

तो, व्यूडाटा (जो व्यूबैग बस लपेटता है) वास्तव में कंट्रोलर कॉन्टेक्स्ट के साथ तुरंत चालू हो जाएगा, साथ ही टेम्पपडेटा को तुरंत चालू किया जाएगा। यह चरण 4 के बाद कुछ कदम होता है: एमवीसी हैंडलर निष्पादन।

बाद में एक दिलचस्प कदम है जहां "अगर पृष्ठ में व्यूडेटा है, तो व्यूडेटा सेट है" नियंत्रक से देखने के लिए हैंडऑफ के दौरान। इससे पहले ViewData स्पष्ट रूप से उपलब्ध है, इसलिए सेट का मतलब तत्काल नहीं हो सकता है। ऐसा लगता है कि इसका अर्थ यह है कि इसे कंट्रोलर से स्थानांतरित किया गया है (जो याद है किसी व्यू के लिए उपलब्ध नहीं है) ViewContext (कंटेनर जो व्यूबैग/व्यूडेटा, और मॉडल तक दृश्य पहुंच प्रदान करता है) में स्थानांतरित किया जाता है।

व्यूडाटा संभवत: शेष दृश्य के रूप में एक ही समय में निपटाया जाता है।

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^