2012-03-28 12 views
6

मैं asp.net MVC के सीख रहा हूँ और कुछ रोचक लगा:एएसपीनेट एमवीसी व्यू का मॉडल बनाम ViewData.Model?

ऐसा लगता है कि मैं स्पष्ट रूप से परिभाषित नहीं कर सकते हैं एक दृश्य के Model दृश्य के भीतर से त्रुटि संदेश के साथ हुए कहा कि यह कोई सेटर है।

@{ this.Model = "Hello" } //error

तब मैं WebViewPage.cs में स्रोत कोड को देखा और एक दृश्य के मॉडल संपत्ति इस तरह वास्तव में है: इस प्रकार त्रुटि

public object Model { get { return ViewData.Model; } }

लेकिन यह मैं यह कैसे कर सकते हैं दिलचस्प है: @{ ViewData.Model = "hello"; } और वास्तव में "हैलो"

मुझे लगता है कि मैं बहुत अधिक इसे में देख रहा हूँ करने के लिए है, जिसके परिणामस्वरूप @model कथन का उपयोग करने में सक्षम हो, लेकिन यह क्यों इतना है? सी # में

शुरुआत और ASP.NET

+0

@ ब्रोकनग्लस शायद आपको अपने प्रश्न को बेहतर ढंग से पढ़ने की जरूरत है, यह एक नौसिखिया प्रश्न है ... इसकी व्याख्या करने के लिए इसके बजाय उपयोगी/उपयोगी ... – NiK

+0

@ जेन कार्लो विरे क्या आप अपना प्रश्न स्पष्ट कर सकते हैं? 'क्यों?' क्या? –

+0

मैं वास्तव में कभी नहीं जानता था कि 'मॉडल' शब्द 'व्यूडाटा' शब्दकोश में निहित था। आश्चर्यजनक, क्योंकि मैंने व्यूडाटा के उपयोग के खिलाफ कई अच्छी तरह से सम्मानित स्रोत ** रेल ** सुना है और फिर भी इसे ढांचे में बनाया गया है। –

उत्तर

7

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

Stevens Sandersons MVC book

2

ModelBinders और क्या नहीं कभी कभी संदर्भ में मॉडल को बदलने की जरूरत है, ताकि वे सेटर की जरूरत है जैसी चीजें। एक और कारण इकाई परीक्षण की सुविधा है।

हालांकि, आपको शायद ही कभी इसे अपने विचारों में करने की आवश्यकता होगी, इसलिए इसे अपने जोखिम पर दुरुपयोग करें।

1

को पढ़ने के लिए यहां कोई जादू नहीं है दृढ़ता से अनुशंसा करते हैं यहाँ। पहले मामले में (जैसा कि आपने बताया), मॉडल संपत्ति के लिए संपत्ति सेटटर नहीं है। तो, आप कुछ भी असाइन नहीं कर सकते हैं। और यह समझ में आता है - आपको मॉडल को फिर से असाइन करने की आवश्यकता क्यों है?

दूसरे मामले में आप ViewData.Model का उपयोग करके उस बाधा को हैक/बाईपास करें। चूंकि यह ऑब्जेक्ट प्रकार का है, इसलिए आप कुछ भी असाइन कर सकते हैं।

(btw, मैं पहली बार कोड में मान कर चलते हैं "हैलो" आवंटित स्निपेट, नहीं 'हैलो')

2

यह एपीआई डिजाइन के सिद्धांत "सफलता के गड्ढे" है। आपको अपने विचार में मॉडल प्रॉपर्टी को बदलना नहीं है, इसलिए वे ऐसा करना कठिन बनाते हैं। लेकिन चूंकि ऐसे मामले हो सकते हैं जहां आपके पास कोई विकल्प नहीं है, इसलिए वे इसे असंभव नहीं बनाते हैं।

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