ASP.NET MVC मॉडल बनाम ViewModel


92

ठीक है, मैं MS के ASP.NET MVC के संबंध में "ViewModels" के बारे में चर्चा सुन रहा हूं।

अब, यह एक विशिष्ट प्रकार का मॉडल होने का इरादा है, सही है? विशिष्ट प्रकार का दृश्य नहीं।

मेरी समझ से, यह एक प्रकार का मॉडल है जिसमें दृश्य के साथ बातचीत करने का एक विशिष्ट उद्देश्य है? या कुछ इस तरह का?

कुछ स्पष्टीकरण की सराहना की जाएगी।

जवाबों:


71

अनिवार्य रूप से मॉडल और व्यू मॉडल दोनों ही विशेषताओं के साथ सरल वर्ग हैं।

इन वर्गों का मुख्य उद्देश्य ("मॉडल") उनके संबंधित दर्शकों के लिए एक वस्तु का वर्णन करना है जो क्रमशः नियंत्रक और दृष्टिकोण हैं।

इसलिए जब आप कहते हैं तो आप पूरी तरह से सही हैं

मेरी समझ में, यह एक प्रकार का मॉडल है जिसमें दृश्य के साथ बातचीत करने का एक विशिष्ट उद्देश्य है

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

आशा करता हूँ की ये काम करेगा :)

अपडेट :

Microsoft ने मॉडल-व्यू-कंट्रोलर के आधार पर बड़े पैमाने पर मार्टिन फाउलर द्वारा प्रेजेंटेशन पैटर्न का एक विशेष संस्करण विकसित किया है और इसे पीएफ एप्लिकेशन के लिए मॉडल-व्यू-व्यूमॉडल (MVVM) कहा है। यह पैटर्न आधुनिक यूआई विकास प्लेटफार्मों पर लक्षित है जहां यूआई डेवलपर्स की पारंपरिक डेवलपर्स की तुलना में व्यावसायिक तर्क के आधार पर विभिन्न आवश्यकताएं हैं। थोडा थ्योरी के लिए यहाँ देखिये


1
ठीक है, धन्यवाद, और अद्यतन के लिए भी धन्यवाद, यह काफी मददगार है! तो, एमएस के विशेष संस्करण को ध्यान में रखे बिना, स्टॉक एमवीसी 2 के साथ, क्या आप ViewModels को एक विशेष, नामित फ़ोल्डर में रखते हैं? या वे अनिवार्य रूप से किसी अन्य की तरह सिर्फ मॉडल फ़ोल्डर में सही प्लॉप किए गए हैं। या, आप भी कर सकते हैं?
Qcom

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

5
ViewModel को (डोमेन) मॉडल से देखें को अलग करना चाहिए। इसलिए यह ViewModel को View के पास रखता है, मॉडल के पास नहीं।
विटालि उलंटिकोव

मैं अपने MVC प्रोजेक्ट के बाहर अपने 'मॉडल' वर्गों को किसी मॉडल फ़ोल्डर में नहीं रखूंगा - मैं फिर भी, MVC प्रोजेक्ट के अंदर दृश्य मॉडल कक्षाएं रखूँगा, ताकि, जैसा कि विटाली कहते हैं कि वे दृश्य के पास होंगे।
डैन हैरिस

@ लोरेंजो अपनी पहली पंक्ति में, आप कहते हैं "विशेषताओं के साथ दोनों सरल कक्षाएं।" मुझे लगता है कि आप गुणों से मतलब रखते हैं? यदि नहीं, तो आप किन विशेषताओं का उल्लेख कर रहे थे? गुण बनाम गुण
xr280xr

69

सबसे सरल शब्दों में, मुझे निम्नलिखित के बारे में सोचना पसंद है:

मॉडल: सख्ती से अपने डेटा मॉडल की तरह दिखता है और महसूस करता है। सभी इरादों और उद्देश्यों के लिए यह आपके डेटा मॉडल का केवल एक वर्ग प्रतिनिधित्व है। इसे आपके दृश्य या आपके दृश्य के किसी भी तत्व का कोई ज्ञान नहीं है। उस ने कहा, इसमें कोई विशेषता डेकोरेटर (यानी आवश्यक, लंबाई, आदि) नहीं होना चाहिए जो आप अपने दृश्य के लिए उपयोग करेंगे।

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

एक उदाहरण के रूप में, आपके मॉडल में निम्नलिखित गुण हो सकते हैं, जो आपके डेटा स्रोत का प्रत्यक्ष प्रतिनिधित्व हैं:

    public string FirstName { get; set; }
    public string LastName { get; set; }

अब, चूंकि आपका दृश्य मॉडल आपके दृश्य से बंधा हुआ है, तो इसमें निम्न गुण हो सकते हैं - जो मॉडल के FirstName फ़ील्ड और LastName फ़ील्ड को एक स्ट्रिंग के रूप में एक साथ जोड़ता है:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}

2
क्या आप ViewModel का पूर्ण उदाहरण प्रदान कर सकते हैं? यह कैसे पता चलेगा कि myModel क्या है और यह myModel का डेटा कैसे प्राप्त करता है?
एम केन्यन द्वितीय

5
स्वभाव से, एक ViewModel एक सादा-पुराना C # ऑब्जेक्ट (POCO) है और यह कभी नहीं जान पाएगा कि आपका डेटा मॉडल कैसा दिखता है। यह आपके डेटा मॉडल और विशिष्ट तत्वों के एक हाइब्रिड से अधिक है जिसे आपके दृश्य को प्रदर्शित करने की आवश्यकता है। जहां तक ​​यह डेटा कैसे मिलता है, आपको इसे डेटा के साथ लोड करना होगा। मुझे एक अलग मध्यस्थ वर्ग का उपयोग करना पसंद है, जहां मैं डेटा के लिए अपनी सेवा को कॉल करता हूं और फिर मैन्युअल रूप से उस डेटा को अपने ViewModel में लोड करता हूं। फिर मैं नियंत्रक कार्रवाई के लिए पूरी तरह से भरी हुई ViewModel लौटाता हूं।
जेसन मार्सेल जूल

26

मुझे यह लेख समझने के लिए एक बहुत उपयोगी संसाधन मिला कि "डोमेन मॉडल" और "मॉडल देखें" एक एमवीसी एप्लिकेशन के भीतर कैसे इंटरैक्ट करते हैं, विशेष रूप से बाध्यकारी के संबंध में। सभी के सर्वश्रेष्ठ में सार वर्णन के बजाय उदाहरण शामिल हैं।

"चूंकि एमवीसी जारी किया गया है, मैंने इस बारे में बहुत भ्रम देखा है कि व्यू मॉडल का निर्माण करना कितना अच्छा है। कभी-कभी यह भ्रम बिना अच्छे कारण के नहीं होता है, क्योंकि सर्वोत्तम अभ्यास सिफारिशों पर वहाँ एक टन जानकारी नहीं लगती है। इसके अतिरिक्त, वहाँ नहीं है। "एक आकार सभी को फिट करता है" समाधान जो चांदी की गोली के रूप में कार्य करता है। इस पोस्ट में, मैं कुछ मुख्य पैटर्न का वर्णन करूंगा जो उभरे हैं और प्रत्येक के पेशेवरों / विपक्षों के लिए। यह नोट करना महत्वपूर्ण है कि इनमें से कई पैटर्न हैं। वास्तविक दुनिया के मुद्दों को सुलझाने वाले लोगों से उभरे हैं। "

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


19

विकीपीडिया में मॉडल बनाम मॉडलव्यू का अधिक पूर्ण विवरण है, जो आपको एसओ उत्तर में मिलेगा: http://en.wikipedia.org/wiki/Model_View_ViewModel

मैं उद्धृत करता हूं:

मॉडल : क्लासिक MVC पैटर्न के रूप में, मॉडल या तो (ए) एक ऑब्जेक्ट मॉडल को दर्शाता है जो वास्तविक राज्य सामग्री (एक वस्तु-उन्मुख दृष्टिकोण) का प्रतिनिधित्व करता है, या (बी) डेटा एक्सेस परत जो उस सामग्री (एक डेटा- का प्रतिनिधित्व करता है) केंद्रित दृष्टिकोण)।

देखें : क्लासिक MVC पैटर्न के रूप में, दृश्य GUI द्वारा प्रदर्शित सभी तत्वों को संदर्भित करता है जैसे बटन, विंडो, ग्राफिक्स और अन्य नियंत्रण।

ViewModel : ViewModel एक "व्यू का मॉडल" है, जिसका अर्थ है कि यह व्यू का एक अमूर्त है जो व्यू और मॉडल के बीच डेटा बाइंडिंग में भी कार्य करता है। यह एक विशेष पहलू के रूप में देखा जा सकता है कि एक नियंत्रक (एमवीसी पैटर्न में) क्या होगा जो डेटा बाइंडर / कनवर्टर के रूप में कार्य करता है जो मॉडल जानकारी को दृश्य जानकारी में बदलता है और दृश्य से मॉडल में आदेश पारित करता है। ViewModel सार्वजनिक गुणों, आदेशों और अमूर्तताओं को उजागर करता है। मॉडल में डेटा की वास्तविक स्थिति के विपरीत ViewModel की तुलना डेटा की एक वैचारिक स्थिति से की गई है।


3
जबकि मॉडल और ViewModel का वर्णन है, वह लिंक केवल MVVM वास्तुशिल्प पैटर्न का वर्णन कर रहा है। मॉडल और व्यू मॉडल के बीच अंतर नहीं
लोरेंजो

5

एक ViewModel की एक धारणा है, लेकिन यह आमतौर पर Asp.net MVC के साथ संबद्ध नहीं है। MVC मॉडल व्यू कंट्रोलर पेटेंट का उपयोग करता है, जहां कंट्रोलर इंटरैक्शन संभालता है, मॉडल से डेटा बनाता है, और फिर उस डेटा को डिस्प्ले के लिए व्यू में पास करता है।

ViewModels (और मॉडल दृश्य ViewModel पैटर्न) आमतौर पर Silverlight और WPF के साथ जुड़ा हुआ है। Xaml थोड़ा अलग है कि व्यूजमॉडल के लिए दो-तरफ़ा बाइंडिंग कर सकते हैं, इसलिए तकनीक थोड़ी अलग है। उदाहरण के लिए, यदि आप किसी टेक्स्ट बॉक्स को किसी फ़ील्ड में बांधते हैं, जैसा कि आप उस टेक्स्टबॉक्स में टाइप करते हैं, तो फ़ील्ड का मान गतिशील रूप से अपडेट किया जाता है। इस तरह की बातचीत वेब पेजों में वास्तव में संभव नहीं है क्योंकि वेब पेज स्टेटलेस होते हैं।

दो पैटर्नों में समानता यह है कि वे दोनों प्रदर्शन से तर्क को अलग करने की कोशिश कर रहे हैं। इसका सबसे आम उपयोग / कारण परीक्षण है: आप कोड से (एक परीक्षण ढांचे के माध्यम से) उन सभी इंटरैक्शन को करने में सक्षम होना चाहते हैं, जो उपयोगकर्ता उपयोगकर्ता इंटरफ़ेस के माध्यम से आह्वान करेंगे।


जिस पुस्तक में मैं पढ़ रहा हूं, वह "प्रोफेशनल ASP MVC 2" है, ViewModel को अध्याय 1 में प्रस्तुति / मॉडल इंटरैक्शन दोनों को जोरदार टाइप और DRY रखने के साधन के रूप में पेश किया गया है। माइक्रोसॉफ्ट के लेखकों में स्कॉट हंसलेमैन, फिल हैक, स्कॉट गुथ्री शामिल हैं।
बेरील

मैंने हाल ही में बहुत अधिक देखा है, कि Asp.net MVC में ViewModel का उपयोग किया जा रहा है। ऐसा लगता है कि ViewModel का डोमेन मॉडल की तुलना में दृश्य में अधिक व्यवसाय है। इसलिए जो पैटर्न हम उपयोग कर रहे हैं, वह है डोमेन मॉडल को ViewModel के प्रमुख भागों को इकट्ठा करना। वर्तमान में, हम एक संशोधित कमांड पैटर्न (संचालन) का उपयोग करते हैं जो अपने कार्यों को करने के लिए डोमेन मॉडल के साथ काम करते हैं। परिणाम ViewModel में इकट्ठा होते हैं और दृश्य में भेजे जाते हैं। इस मामले में viewmodel सभी एनोटेशन और सरल, केंद्रित तर्क रखता है जो दृश्य का समर्थन करता है।
सिनास्टेटिक जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.