2011-12-19 6 views
5

मैं एएसपी.नेट एमवीसी 3 का उपयोग कर रहा हूं और मुझे आश्चर्य है कि डिफ़ॉल्ट मॉडलबिंडर सार्वजनिक गुणों से जुड़ा हुआ है लेकिन सार्वजनिक क्षेत्रों में नहीं।क्या कोई कारण है कि डिफ़ॉल्ट मॉडलबिंडर फ़ील्ड से बंधे नहीं है?

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

प्रश्न: इसके पीछे कारण क्या है?

उत्तर

0

शायद फ़ील्ड को अनदेखा करने का कारण बाइंडर के प्रदर्शन को बढ़ाने के लिए है। सभी क्षेत्रों और संपत्तियों को खोजने के बजाय। केवल मॉडल के लिए मॉडल बाइंडर खोज।

हालांकि मुझे लगता है कि मॉडल बाइंडर प्रदर्शन में सुधार के लिए कैश का उपयोग करता है।

2

लेकिन कभी कभी मैं कुछ पूर्वनिर्धारित वर्ग है जो कुछ क्षेत्रों

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

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

+1

ठीक है, लेकिन इसके लिए आपके पास एक्सेस संशोधक हैं। यदि मैं नहीं चाहता कि कोई फ़ील्ड सीधे सेट किया जाए, तो मैं इसे 'निजी' घोषित करता हूं। व्यूमोडेल कक्षाएं आमतौर पर केवल डेटाकॉन्टेनर्स होती हैं और अधिकतर इसमें अधिक तर्क नहीं होता है - इसलिए मैंने सोचा कि सार्वजनिक क्षेत्रों का उपयोग करना ठीक हो सकता है। – Jan

+0

@ जेन, सामान्य रूप से फ़ील्ड निजी होना चाहिए। –

+1

और आमतौर पर आपको गुणों के गेटर्स में तर्क नहीं होना चाहिए ... – gdoron

0

डिफ़ॉल्ट मॉडेलबिन्डर एक सार्वजनिक विधि का खुलासा करता है: DefaultModelBinder.BindModel, और ओवरराइडिंग के लिए कई संरक्षित विधि उपलब्ध हैं। उनमें से सभी here सूचीबद्ध हैं।

मॉडल इसके अलावा, इन विधि वाली प्रॉपर्टी के लिए, नहीं क्षेत्रों

  • GetModelProperties की तरह, देखें,
  • GetFilteredModelProperties,
  • GetPropertyValue,
  • OnXYZValidating,
  • OnXYZValidated,
  • OnXYZUpdating,
  • OnXYZUpdated,
  • GetXYZValue,

जहां XYZ के लिए या तो Model, या Property/ies, या दोनों, और इतने पर खड़ा है।

जैसा कि आप देख सकते हैं कि इन नामों के साथ कोई Fields उल्लेख नहीं किया गया है। Darin के रूप में बताया गया है कि मॉडल के राज्य में कोई प्रत्यक्ष परिवर्तन बाइंडर द्वारा बर्दाश्त नहीं किया जाता है। इसलिए इसकी विधियों में Field नहीं।

और साथ ही, आप एक और महत्वपूर्ण कक्षा: ModelBindingContext पर एक नज़र डालना चाहेंगे। इस वर्ग का एक उदाहरण BindModel, और बाद में BindSimpleModel, और BindComplexModel, पर मॉडल प्रकार (string, int, ... के आधार पर सरल माना जाता है, सब कुछ जटिल है) को पारित किया जाता है।

तो, इस संदर्भ निम्नलिखित गुण है:

  • ModelXYZ, और
  • PropertyXYZ।

दूसरे शब्दों में आपके पास अपने व्यू मॉडेल में फ़ील्ड का संदर्भ देने का कोई मतलब नहीं है जबतक कि आप इन कक्षाओं को ओवरराइड नहीं करते हैं और ऐसा करने के लिए विशेष कार्यवाही करते हैं।

लेकिन फिर, ढांचे से लड़ने से सावधान रहें, इसके बजाए इसका पालन करना हमेशा आसान होता है।

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

आशा इस इसमें से अधिकांश बताते हैं: तो, भले ही आप के वारिस और DefaultModelBinder और ModelBinderContext ओवरराइड करने के लिए प्रयास करते हैं, तो आप अभी भी नहीं fiellds तक पहुँचने के लिए, कोई बात नहीं क्या उनके उपयोग संशोधक है सक्षम हो जाएगा।

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

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