2011-04-26 14 views
8

मेरे पास एक एमवीसी रेज़र दृश्य है जो ऑर्डर संग्रह पर पुनरावृत्त करता है। प्रत्येक आदेश में एक ग्राहक होता है, जो शून्य हो सकता है।एमवीसी रेजर में शून्य बच्चे इकाइयों को कैसे संभालें

परेशानी है, जब यह मामला है तो मुझे एक शून्य संदर्भ अपवाद मिलता है।

@foreach (var item in Model) { 
<tr> 
     <td> 
     @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | 
     @Html.ActionLink("Delete", "Delete", new { id=item.ID }) 
    </td> 
    <td> 
     @item.Number 
    </td> 
    <td> 
     @String.Format("{0:g}", item.ReceivedDate) 
    </td> 
    <td> 
     @item.Customer.Name 
    </td> 

@ item.Customer.Name आइटम के दौरान उड़ाता है। ग्राहक शून्य है (जैसा कि आप उम्मीद करेंगे)।

यह एक आसान सवाल होना चाहिए लेकिन उत्तर पाने में सक्षम नहीं है!

व्यूमोडेल स्थापित किए बिना इसका निपटारा करने का सबसे अच्छा तरीका क्या है?

धन्यवाद डंकन

उत्तर

4

एक साधारण काम करता है, तो क्या करना चाहिए:

<td> 
    @if (item.Customer != null) 
    { 
     <text>@item.Customer.Name</text> 
    } 
</td> 

यह कहा और दिखाया जा रहा है, कि केवल एक समाधान है। वास्तविक समाधान में एक विशिष्ट दृश्य मॉडल को परिभाषित करने और उपयोग करने में शामिल है।

7

निम्नलिखित का प्रयास करें:

<td>   
    @(item.Customer != null ? item.Customer.Name : "") 
</td> 

संपादित करें: यह सुनिश्चित करने के लिए रेजर में काम करेंगे संलग्न।

+0

यह रेज़र दृश्य के अंदर काम नहीं करेगा। यदि आप इसे संलग्न करते हैं तो इसे चाहिए। @ (item.Customer! = Null? Item.Customer.Name: "") –

+0

@ mr-grok - आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने इसे स्मृति से लिखा है, लेकिन मैं सही वाक्यविन्यास को प्रतिबिंबित करने के लिए अपनी पोस्ट को संपादित और अपडेट कर दूंगा। – Leons

0
@foreach (var item in Model.Where(item => item.Customer != null)) 
2

सुनिश्चित नहीं हैं कि आप इन वस्तुओं लेकिन हैंडलिंग इस अशक्त वस्तु डिजाइन पैटर्न का उपयोग करना है का एक और तरीका यह एक परीक्षण है और नाम के लिए उत्पादन सार्थक पाठ करने के लिए आप की अनुमति के लिए की आवश्यकता को दूर हैं का निर्माण (" अज्ञात "," ", कोई नहीं जो कुछ भी)

http://sourcemaking.com/refactoring/introduce-null-object

5

सबसे पहले आप उपयोग कर सकते हैं में निर्मित एचटीएमएल सहायक Html.DisplayFor(m => m[i].Customer.Name) यदि आप के बजाय यात्रा foreach के लिए उपयोग कर जाएगा। लेकिन इसमें कुछ नकारात्मक है। आपके पास इंडेक्सर संग्रह संपत्ति नहीं हो सकती है और DisplayFor विधि अभिव्यक्ति पैरामीटर प्राप्त कर सकती है और इसे महंगी रूप से संकलित कर सकती है।

उनके बजाय आप अपनी खुद की विधि बना सकते हैं जो इस परिदृश्य को नीचे की तरह बेहतर तरीके से संभालती है।

public static class Utility 
{ 
    public static TValue NullSafe<T,TValue>(this T obj,Func<T,TValue> value) 
    { 
     try 
     { 
      return value(obj); 
     } 
     catch (NullReferenceException/*Exception can be better choice instead of NullReferenceException*/) 
     { 
      return default(TValue); 
     } 
    } 
} 

अब आप यह happly तरह

@item.NullSafe(m=>m.Customer.Name) 

विस्तार के रूप में NullSafe विधि बनाना या स्थिर अपनी पसंद है उपयोग कर सकते हैं।

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