2012-03-01 12 views
6

के साथ शून्य मॉडल को संभालना सभी अक्सर मैं एक ऐसी स्थिति में चला जाता हूं जिसमें मेरी परियोजना में एक दृश्य शून्य संदर्भ अपवाद फेंकता है।एमवीसी 3 व्यूज़: फिननेस

@model Johnny.Application.TestModel 
<div>@(Model.SomeText)</div> 

यह एक त्रुटि फेंकता है तो मॉडलअशक्त है।

लेकिन लोग इसे कैसे प्रबंधित कर रहे हैं? मैं निश्चित रूप से दृश्य में कोड को कूड़े हुए बदसूरत नल चेक के साथ कोड नमूने नहीं देखता हूं। इससे मुझे विश्वास होता है कि ज्यादातर समय, नियंत्रकों को नल मॉडल वापस नहीं करना चाहिए। लेकिन आप इसे अधिक ताकत के साथ कैसे लागू कर सकते हैं?

अभी जैसे ही कोई गलती से नियंत्रक को एक नल मॉडल लौटने का कारण बनता है, दृश्य मॉडल उड़ाता है और गलती में दिखता है। हकीकत में, यह नियंत्रक की गलती थी। और दृश्य समस्या को "पकड़" भी नहीं सकता है, यह केवल तभी होगा जब मॉडल के सदस्यों का उपयोग किया जाए (जो कि समय का सबसे अधिक समय है)।

विभिन्न कारणों से, कुछ विचार शून्य मानों को संभालना चाहते हैं। हालांकि, यह बहुमत का मामला होने की उम्मीद नहीं करेगा। स्पष्ट रूप से यह दृश्य और नियंत्रक के बीच कुछ "अनुबंध" स्थापित करने का मामला है।

मैं विकल्पों मैंने देखा है पसंद नहीं है:

  1. जांच करें कि मॉडल हर बार यह प्रयोग किया जाता है रिक्त है। बहुत लंगड़ा!
  2. एक बड़ा अगर कथन पूरे दृश्य को एक नल मॉडल चेक के साथ लपेटें। बर्बाद कोड अचल संपत्ति के बारे में सोचो। लंगड़ा!
  3. शीर्ष पर फेंकने के साथ जोड़ें। बुरा नहीं है, लेकिन मूर्खतापूर्ण लगता है। हल्के से लंगड़ा

मुझे पता है कि प्यार होता है, तो इन विकल्पों की तरह कुछ "कोई nulls" अनुबंध स्थापित करने के लिए ही अस्तित्व में:

  • की तरह [NoNullModels] नियंत्रक पद्धति पर एक विशेषता। मुझे संदेह है कि यह अस्तित्व में है, क्योंकि मुझे नहीं लगता कि नियंत्रक जानता है कि यह किस हुकूमत को देख रहा है।
  • ध्यान में रखते हुए @ MVC3.HeyDontAllowNulls की तरह एक संकेतक या एक अपवाद (ऊपर विकल्प 3) की तरह फेंक के कुछ अन्य मानक तरीका
+0

आप एक नल मॉडल क्यों वापस लाएंगे? –

+1

क्या आपने '@ Html.DisplayFor (m => m.SomeText)' –

+0

कोड नमूना विषय पर, इंटरनेट पर 99% कोड नमूने अपवाद हैंडलिंग और इनपुट सत्यापन से रहित हैं। आलस्य से आंशिक रूप से और आंशिक रूप से क्योंकि यह इस बिंदु को भ्रमित करेगा कि कोड नमूना चित्रण कर रहा है। –

उत्तर

2

मैं यहाँ Should one try to guard against null reference exceptions/index out of bounds exceptions in MVC views? एक समान प्रश्न पूछा और यह करने के लिए अच्छा प्रतिक्रियाएं मिल गया। संक्षेप में, आपके नियंत्रकों में नल चेक और शायद आपके विचारों के बजाय इकाई परीक्षण भी जोड़ना पसंद किया जाता है।

+0

मैंने इकाई परीक्षण दृष्टिकोण के बारे में नहीं सोचा था, और यह उनकी उपयोगिता के लिए एक अच्छा परिदृश्य है। चूंकि मैं सभी कोड "स्वामित्व" नहीं करता हूं, इसलिए मैं सभी नियंत्रकों इकाई को टेस्ट करने योग्य नहीं कर पाऊंगा, इसलिए मैं इन मामलों में दृश्य के लिए फ़ॉलबैक विकल्प ढूंढने की उम्मीद कर रहा हूं। –

+0

मैं यह भी स्वीकार करता हूं कि अगर मैंने कहा था कि एक अत्यधिक साझा दृश्य जो कई क्रिया विधियों से प्रदान किया गया है, तो मैं निश्चित रूप से एक दर्जन अन्य स्थानों की बजाय, दृश्य में एक नल चेक जोड़ने का लुत्फ उठाऊंगा भले ही मेरे पास सभी कोड हैं। आप चिंता के एमवीसी पृथक्करण का उल्लंघन करने की लागत पर डीआरवाई सिद्धांत का पालन करने में सक्षम हो सकते हैं। –

+0

जितना अधिक मैं इसके बारे में सोचता हूं, उतना ही मुझे लगता है कि दृश्य कुछ जोड़ने के लिए सही जगह है। एक कारण यह है कि एक एकल नियंत्रक कार्रवाई कई अलग-अलग विचारों पर जा सकती है। नियंत्रक पक्ष पर इसे ठीक करना प्रभावी नहीं है, क्योंकि यह जल्द या बाद में एक रिसाव वसंत करेगा (जैसे स्थिति मैं चल रहा हूं!) –

0

कई वरीयताओं यहाँ हैं, कुछ जो आप कर सकते हैं: आपका डेटा स्तर (कस्टम अपवाद) में

  1. फेंक RecordNotFoundException और एक वैश्विक अपवाद फ़िल्टर पकड़ है से वापस आ रहा nulls के लिए इस
  2. चेक केस परिदृश्य
  3. किसी मामले में आपके रिपोजिटरी और हैंडल को अपने नियंत्रकों को GET विधियों पर एक नल मॉडल की तलाश करने के लिए सजाने के लिए तैयार करें जो कि क्रियाएं नहीं बनाते हैं (या जो भी नियम आप ठीक मानते हैं) OnActionExecuted में इसकी जांच करने के लिए एक एक्शन फ़िल्टर विशेषता के साथ

यहां तक ​​कि मेरे "CREATE" विचारों को आम तौर पर एक मॉडल मिलता है, भले ही खाली हो (हालांकि अक्सर इसमें एक आईनेमेरेबल < चयन लिस्टइटम > उनमें से), इसलिए उन्हें हमेशा मॉडल जाना चाहिए।

0

मैं कभी-कभी इसके दृश्यों में अपने विचारों में नल की जांच करता हूं।

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

मेरे पास उदाहरण के लिए एक मामला है जहां लोग कुछ की सदस्यता लेते हैं और अधिसूचनाएं सेट करते हैं। अगर उनके पास कोई अधिसूचना नहीं है तो मेरे मॉडल का सब-ऑब्जेक्ट शून्य है। मैं डिफ़ॉल्ट मान सेट नहीं करना चाहता हूं इसलिए मेरे पास एक चेक है। अन्य खंडों में मैं सिर्फ एक डिफ़ॉल्ट मान का उपयोग करता हूं।