2010-10-31 13 views
69

ठीक है, मैं एमएस के एएसपी.नेट एमवीसी के संबंध में "व्यू मॉडेल" के बारे में चर्चा सुन रहा हूं।एएसपी.नेट एमवीसी मॉडल बनाम व्यूमोडेल

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

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

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

उत्तर

54

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

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

तो आप पूरी तरह से सही है जब आप कहते

मेरी समझ के लिए

हैं, यह

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

आशा है कि यह मदद करता है :)

अद्यतन:

माइक्रोसॉफ्ट प्रस्तुति पैटर्न के एक विशेष संस्करण मार्टिन द्वारा Fowler बड़े पैमाने पर मॉडल-व्यू-नियंत्रक पर आधारित है और विकसित किया गया है मॉडल-View- यह कहा जाता है पीएफ आवेदन के लिए ViewModel (एमवीवीएम)। यह पैटर्न आधुनिक यूआई विकास प्लेटफार्मों पर लक्षित है जहां पारंपरिक डेवलपर्स की तुलना में यूआई डेवलपर्स के पास व्यावसायिक तर्क पर आधारित विभिन्न आवश्यकताएं होती हैं। सिद्धांत का एक बिट के लिए एक नज़र here है

+1

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

+0

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

+5

व्यूमोडेल को (डोमेन) मॉडल से अलग करना है। इसलिए मॉडल के नजदीक व्यूमोडेल को व्यू के पास रखना समझ में आता है। –

16

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

मैं बोली:

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

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

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

+3

मॉडल और व्यूमोडेल का विवरण होने पर, यह लिंक सिर्फ एमवीवीएम आर्किटेक्चरल पैटर्न का वर्णन कर रहा है। मॉडल और व्यू मॉडल के बीच अंतर नहीं – Lorenzo

+1

मेरे पास स्वीकृत उत्तर की तुलना में मतभेदों का बेहतर विवरण है :) –

+0

मैं सहमत हूं - जेसन मार्सेल द्वारा यह और उत्तर दोनों 'बनाम' को बेहतर तरीके से कैप्चर करते हैं। इस सवाल का हिस्सा है। –

5

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

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

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

+0

+1 उन दो पैटर्नों के बीच समानताओं का वर्णन करने के लिए जो मैं – Lorenzo

+0

का उल्लेख करना भूल गया हूं, "प्रोफेशनल एएसपी एमवीसी 2" पुस्तक में, व्यू मॉडेल को प्रस्तुति/मॉडल इंटरैक्शन को दृढ़ता से टाइप और ड्रॉ दोनों रखने के साधन के रूप में अध्याय 1 में पेश किया गया है। । माइक्रोसॉफ्ट लेखकों में स्कॉट हैंसलमैन, फिल हैक, स्कॉट गुथरी शामिल हैं। – Berryl

+0

मैंने हाल ही में देखा है कि व्यूमोडेल का उपयोग Asp.net एमवीसी में किया जा रहा है। ऐसा लगता है कि ViewModel डोमेन मॉडल की तुलना में दृश्य में अधिक व्यवसाय है। तो हम जिस पैटर्न का उपयोग कर रहे हैं वह है कि डोमेन मॉडल व्यूमोडेल के प्रमुख हिस्सों को इकट्ठा करें। वर्तमान में, हम एक संशोधित कमांड पैटर्न (ऑपरेशंस) का उपयोग करते हैं जो डोमेन कार्यों के साथ अपने कार्यों को करने के लिए काम करते हैं। परिणाम ViewModel में इकट्ठे होते हैं और दृश्य में भेजे जाते हैं। इस मामले में व्यूमोडेल सभी एनोटेशन और सरल, केंद्रित तर्क है जो दृश्य का समर्थन करता है। – Sinaesthetic

24

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

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

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

+1

बहुत अच्छा लिंक आलेख। मैंने पाया ट्यूटोरियल इस मुद्दे को संबोधित नहीं किया था और यह वही है जो मैं – Tasio

+0

@ मिस्टरडेन - ग्रेट आलेख, बहुत जानकारीपूर्ण, साझा करने के लिए धन्यवाद के लिए देख रहा था। +1 :) – Bibhu

+1

उत्कृष्ट लेख। –

49

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

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

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

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

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

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

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

क्या आप व्यूमोडेल का एक पूर्ण उदाहरण प्रदान कर सकते हैं? यह कैसे पता चलता है कि मेरा मॉडल क्या है और यह मेरे मॉडल के लिए डेटा कैसे प्राप्त करता है? –

+3

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

+2

बहुत बढ़िया स्पष्टीकरण! धन्यवाद महोदय! – Unbreakable

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