2011-12-09 7 views
11

मैं निम्नलिखित है, लेकिन यह एक NullReferenceException साथ नाकाम रहने है:एएसपी.नेट एमवीसी रेजर में काम करने के लिए नल कोलेसे ऑपरेटर कैसे प्राप्त करें?

<td>@item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? -</td> 

OneMonth

public virtual decimal? OneMonth { get; set; } 

के रूप में परिभाषित किया गया है और इसके मूल्य समय है कि यह विफल रहता है पर रिक्त है।

मैंने सोचा कि नल कोलेसे ऑपरेटर परीक्षण करेगा यदि इसकी शून्य और यदि ऐसा है, तो ऑपरेटर के दाईं ओर मूल्य वापस कर दें?

मुझे यह काम करने के लिए बदलने की क्या ज़रूरत है?

+3

क्या आप वाकई 'FirstPrDefault() 'द्वारा चयनित' FundPerformance'-object 'नहीं हैं जो शून्य है? यदि ऐसा कोई मामला है जो आप किसी ऑब्जेक्ट से संदर्भ प्राप्त करने का प्रयास कर रहे हैं जो शून्य है, जो 'NullReferenceException' –

+0

देता है तो मुझे लगता है कि जोकिम सही है। साथ ही, आपको वास्तव में एक व्यूमोडेल में यह गणना करना चाहिए और बस अपने रेज़र दृश्य में जवाब देना चाहिए। और यदि आप वास्तव में अपने विचार से डेटाबेस लुकअप कर रहे हैं तो यह बहुत शरारती है! :-) –

+0

हाय दोस्तों। यह आपके दोनों सही हो जाता है। मैंने एक गूंगा किया। बस किसी भी चिंताओं को कम करने के लिए, मैं वादा करता हूं कि मैं दृश्य से डेटाबेस कॉल नहीं कर रहा हूं! ViewModel रिपोजिटरी में एक सेवा कॉल के माध्यम से नियंत्रक में आबादी है। – DaveDev

उत्तर

22

रेज़र सिंटैक्स, जैसा कि आपने लिखा है, "वनमोनथ" पर समाप्त होता है। ?? पाठ के रूप में व्याख्या की जाती है। यह रेजर के रूप में व्याख्या करने के लिए, आप() इस तरह के पूरे बयान लपेट चाहिए:

<td>@(item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? "-")</td> 

यह अभी भी आप एक त्रुटि प्राप्त होगी: बाईं ऑपरेटर एक दशमलव है और सही ऑपरेटर एक श्रृंखला है। तो आप या तो "-" के बजाय शून्य प्रस्तुत कर सकते हैं या टर्नरी ऑपरेटर का उपयोग कर सकते हैं, OneMonth.Value.ToString() को बाएं मान के रूप में और "-" सही मान के रूप में।

1

यह एमवीसी या रेजर के साथ कुछ लेना देना नहीं है।

FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault() 

अशक्त वापस आ जाएगी अगर कोई तत्व से मेल खाता है, अशक्त एक OneMonth porperty नहीं है तो आप एक अशक्त रेफरी अपवाद मिल जाएगा है। आप उपयोग नहीं कर सकते हैं ?? ऑपरेटर क्योंकि यह OneMonth नहीं है जो शून्य है, यह FirstOrDefault() का परिणाम है।

तो आप एक "अनुक्रम कोई तत्व" अपवाद के बजाय तो आप जानते हैं कि आपकी समस्या है मिल

FundPerformance.Where(xx => fund.Id == xx.Id).First().OneMonth ?? -</td> 

करने के लिए अपने कोड बदलने का परीक्षण करने के।

+0

यह मेरा मुद्दा था, जिसे शून्य के अलावा नल-सशर्त ऑपरेटर ('?') का उपयोग करके ठीक किया जा सकता है -कोलेसिंग ऑपरेटर ('??')। 'स्ट्रिंग खाली IfNull = संभव NullObject? संभावित रूप से NullProperty ?? ""; ' – Sinjai

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