2010-10-29 13 views
6

में क्या है इसके लिए सबसे अच्छा अभ्यास मैं सोच रहा हूं कि यह एक अच्छा विचार या बुरा है, क्या ड्रॉप डाउन सूची में बाध्यकारी के लिए ViewModel में देशों की सूची जैसे चीजें रख रहे हैं? उदाहरण के लिए किसी साइट के पंजीकरण पृष्ठ पर।व्यूमोडेल

मैं इस धारणा के तहत था कि एक व्यूमोडेल भरने वाले फॉर्म के उदाहरण का प्रतिनिधित्व करना चाहता है, लेकिन मुझे लगता है कि मैं गलत हो सकता हूं क्योंकि मैंने देखा है कि अन्य लोगों ने अपने व्यूमोडेल में सूचियों जैसी चीजें डाली हैं।

क्या इसे किसी स्थिर वर्ग में कहीं और बेहतर से देखने के लिए बेहतर नहीं होगा?

CommonData.ListCountries(); और फिर सीधे दृश्य में SelectList आइटम सूची में कनवर्ट करने के लिए Lambda का उपयोग कर?

उत्तर

9

जैसा कि आपने महसूस किया है कि आपके लक्ष्य को पूरा करने के कई तरीके हैं। जबकि MVC design pattern कुछ एप्लिकेशन संगठनों को प्रोत्साहित करता है कि आप अपने मॉडल, विचारों और नियंत्रकों को व्यवस्थित करते हैं, अंत में वरीयता का मामला है।

स्कॉट एलन ब्लॉग पोस्ट में ASP.NET MVC drop down lists से निपटने के लिए अपनी प्राथमिकता पर चर्चा करता है। स्कॉट अपने मॉडल पर एक जटिल प्रकार के गणित को IEnumerable<SelectListItem> में परिवर्तित करने के लिए एक विस्तार विधि का उपयोग करता है। उसके बाद वह वर्णन करता है कि पोस्ट एएसपी.नेट एमवीसी IEnumerable<SelectListItem> पर वापस नहीं लौटाएगा, लेकिन उसने केवल उपयोगकर्ता को चुना था। उसके बाद वह सुझाव देता है कि दो मॉडल का उपयोग चीजों को सरल बना सकता है।

यह एक उचित वर्णन है जिसे मैं व्यूमोडल्स और फॉर्ममोडल्स के रूप में संदर्भित करता हूं। एक व्यू मॉडेल दृश्य डेटा को दृश्य में रखता है और एक फॉर्ममोडेल का उपयोग एकत्रित डेटा को नियंत्रक कार्रवाई में वापस ले जाने के लिए किया जाता है। आगे की व्याख्या करने के लिए:

  • व्यू मॉड्यूल में ऐसे डेटा होते हैं जो दृश्य प्रस्तुत करने में सहायता करते हैं। मेरे व्यू मॉडल्स को व्यवस्थित करके इस तरह से मैं एक विशेष मॉडल को किसी विशेष मॉडल में प्रस्तुत करने के लिए सभी आवश्यक जानकारी रख सकता हूं। यह मुझे किसी भी चीज़ के लिए व्यूडाटा का उपयोग करने से रोकता है जो वास्तव में अस्थायी नहीं है।
  • फॉर्म मॉडलों का उपयोग उपयोगकर्ता इनपुट एकत्र करने के लिए किया जाता है। फॉर्ममोडल्स (लगभग) में अन्य जटिल प्रकारों के संदर्भ कभी नहीं होते हैं और वे प्राइमेटिव, डेटटाइम और स्ट्रिंग्स से बने होते हैं।

किसी भी मामले में मेरे पास never reuse a model for a different view पर एक कठिन नियम है। अपने मॉडल को प्रस्तुत करने के लिए उपयोग किए गए विचारों के साथ बारीकी से गठबंधन करने से आपके विचार लिखना आसान हो जाता है। आपको स्थैतिक तरीकों जैसी चीजों के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि आपके मॉडल को उनके संबंधित विचारों में डेटा को ऐसे रूप में ले जाना चाहिए जो उनके लिए प्रस्तुत करना आसान हो। AutoMapper जैसे टूल प्रदर्शन उद्देश्यों के लिए मॉडल में "फ़्लैटन" डोमेन ऑब्जेक्ट्स में मदद कर सकते हैं।

अतिरिक्त पढ़ने चेकआउट के लिए: ASP.NET MVC terminology is tripping me up - why 'ViewModel'?

+0

धन्यवाद। लेकिन, अगर मैं AJAX का उपयोग नहीं कर रहा हूं तो फॉर्म पर त्रुटियों को दिखाने और ड्रॉप डाउन सूचियों को फिर से बाध्य करने का सबसे साफ तरीका क्या है? मैं वास्तव में अपने व्यू मॉडल का एक नया उदाहरण नहीं बना सकता क्योंकि इसमें आंशिक रूप से भरे हुए फॉर्म हैं, लेकिन मुझे दूसरी बार देखने के लिए देशों की सूची फिर से बनाने की आवश्यकता है। – lahsrah

+0

lahsrah: मैंने viewmodel के लिए .populate() विधि बनाई है और मैं उस विधि को नियंत्रक से कॉल करता हूं और केवल ड्रॉपडाउन मेनू भरता हूं, अन्य गुण सबमिट किए गए फॉर्म से संरक्षित होते हैं – Muflix

3

जो भी डेटा आपकी दृश्य आवश्यकता है, उसे ViewModel में रखें।

जिस तरह से मैं इसे देखता हूं, एक बार आपका विचार प्रतिपादन प्रक्रिया के माध्यम से जा रहा है, उसके पास उस मॉडल से आवश्यक सभी जानकारी होनी चाहिए जो इसे बाध्य है।

यदि आप सहायक तरीके का उपयोग करना शुरू करते हैं, तो दृश्य एक अर्थ में "नियंत्रक पर वापस जा रहा है"। एक्सटेंशन/सहायक तरीके स्वरूपण, आदि, के लिए ठीक हैं लेकिन उन्हें मॉडल पर कॉल नहीं करना चाहिए।

भूलें, आपके पास व्यूडेटा भी है (मूल रूप से HttpContext.Current.Items, एकल अनुरोध के लिए रहता है), जो एक हल्के भंडारण तंत्र है जिसका उपयोग आंशिक विचारों (उदाहरण के लिए) में डेटा साझा करने के लिए किया जा सकता है।

+0

ठीक है, तो मैं कैसे इस मामले में जहां वहाँ के रूप में मान्यता त्रुटियाँ हैं और ViewModel parially भरा प्रपत्र प्रदर्शित करने के लिए मूल कार्रवाई में वापस पारित किया जा करने की जरूरत है संभाल है, मैं डेटाबेस से फिर से सूची लाने की आवश्यकता होगी। इस दृश्य में वापस जाने से पहले इन ड्रॉप डाउन सूचियों को फिर से पॉप्युलेट करने के लिए दृश्य मॉडल पर एक पॉप्युलेट विधि जोड़ने का एक अच्छा विचार है, इसलिए मैं दो स्थानों पर ड्रॉपडाउन सूचियों को पॉप्युलेट नहीं कर रहा हूं? – lahsrah

+2

नहीं, यह एक अच्छा विचार नहीं है। ViewModel डेटा को पकड़ने के लिए सरल संग्रहण तंत्र होना चाहिए, इसे पुनर्प्राप्त नहीं करना चाहिए। इसमें गुणों (आमतौर पर बोलने) के अलावा कुछ भी नहीं होना चाहिए। याद रखें, यह वेब फॉर्म नहीं है। कोई व्यूस्टेट नहीं है, आपके अनुरोध स्टेटलेस होना चाहिए। यदि आप अपना फॉर्म जमा करने के बाद आपको कुछ डेटा फिर से चाहिए, तो इसे फिर से प्राप्त करें, और केवल व्यूमोडेल में मान सेट करें। मॉडल स्थिति द्वारा प्रमाणीकरण त्रुटियों को संभाला जाना चाहिए। Www.asp.net/mvc – RPM1984

+0

पर कुछ vids/ट्यूटोरियल पर नज़र डालें, डेटा को रीफ्रेश करने से भी बेहतर AJAX फॉर्म पोस्ट कर रहा है और क्लाइंट (जैसे जावास्क्रिप्ट) को यह निर्णय लेने का निर्णय लेता है कि सफलता या त्रुटि संदेश के बाद पृष्ठ को रीडायरेक्ट करना है वापस आ गया है – Ryan

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