2013-05-22 9 views
19

कैसे आप एक नेस्टेड मॉडल में DisplayNameFor का उपयोग करते हैं में DisplayNameFor का उपयोग करते हैं - यानी .:कैसे आप एक नेस्टेड मॉडल

public class Invoice 
{ 
    public int InvoiceId { get; set; } 
    public string CustomerName { get; set; } 
    public string Contact { get; set; } 
    public IList<InvoiceItem> InvoiceItems { get; set; } 
} 

public class InvoiceItem 
{ 
    public int InvoiceItemId { get; set; } 
    public int InvoiceId { get; set; } 
    [Display(Name = "Item Heading")] 
    public string Item { get; set; } 
    [Display(Name = "Item Description")] 
    public string Description { get; set; } 
    public virtual Invoice Invoice { get; set; } 
} 

मैं नेस्टेड आइटम के माध्यम से लूप इस प्रकार कर सकते हैं के रूप में:

 @foreach (var item in Model.InvoiceItems) 
    { 
      @Html.DisplayFor(modelItem => item.Item) 
      <br /> 
      @Html.DisplayFor(modelItem => item.Description) 
      <br /> 
    } 

लेकिन मैं कैसे मैं करने के लिए मिलता है: [Display(Name = "Item Heading")]

@Html.DisplayNameFor(modelItem => modelItem.Item) 

मैं त्रुटि मिलती है: 'inv5.Models.Invoice' does not contain a definition for 'Item' and no extension method 'Item' accepting a first argument of type 'inv5.Models.Invoice' could be found

धन्यवाद, मार्क

उत्तर

31
यहाँ आप अपने पाश में item तक पहुँच बना रहे

: इस और के बाद

@Html.DisplayNameFor(modelItem => modelItem.Item) 

बदलें:

@Html.DisplayFor(modelItem => item.Item) 

लेकिन यहाँ आप नहीं कर रहे हैं यह काम करना चाहिए:

@Html.DisplayNameFor(modelItem => item.Item) 

modelItem प्रकार Invoice (मॉडल को देखने के लिए पारित किया गया) है, लेकिन लूप में आप item (लूप इटरेटर से) का उपयोग करना चाहते हैं जो InvoiceItem प्रकार का है।

साइड नोट: "। आइटम" कुछ इस तरह डिबगिंग एक बहुत और अधिक सरल है, तो सब कुछ नहीं बुलाया गया था हो सकता है साफ़ नामकरण महत्वपूर्ण है :)

संपादित करें: यदि आप इसे लूप के बाहर एक्सेस कर रहे हैं, तो आपको मैन्युअल रूप से मॉडल में ड्रिल करने की आवश्यकता है। कुछ इस तरह:

@Html.DisplayNameFor(modelItem => modelItem.InvoiceItems.First().Item) 

यह की तरह इस खतरनाक होगा लगता है, अगर वहाँ कोई आइटम नहीं है के बाद से .First() एक अपवाद फेंक कर सकते हैं। हालांकि, जैसा कि टिप्पणियों ने इंगित किया है और कुछ कर्सर गुगलिंग की पुष्टि है, .First()वास्तव में इस मामले में रनटाइम पर निष्पादित नहीं है। संपत्ति में प्रतिबिंबित करने के लिए .DisplayNameFor() को अनुमति देने के लिए यह केवल कुछ चाल है।

+0

वाह, मैं इसे कभी नहीं देखा होगा की है, ईमानदारी से मिनट की जोड़ी के लिए यह घूर रहा था :))) –

+0

हाय-पॉइंट लेयर नाम - लेकिन मैं लूप में प्रवेश करने से पहले DisplayNameFor दिखाना चाहता हूं। वर्तमान में यदि मैं इसे सुझाए अनुसार बदलता हूं, तो मुझे "नाम 'आइटम' वर्तमान संदर्भ में मौजूद नहीं है" - धन्यवाद, मार्क – Mark

+1

@ फ़िक्सिट: लूप के संदर्भ के बाहर पूरी तरह से एक अलग कहानी है। आप 'modelItem.InvoiceItems.First() आइटम' जैसी कुछ कोशिश कर सकते हैं। यदि सूची 'DisplayNameFor' वास्तव में कैसे काम करती है, इस पर निर्भर करता है कि सूची खाली है तो _might_ अपवाद फेंक दें। (मैंने कभी इसके आंतरिक भाग पर नहीं देखा है।) – David

3

आप अपने InvoiceItems के लिए एक DisplayTemplate बना सकते हैं, कहते हैं कि "InvoiceItemHeader":

@model IEnumerable<InvoiceItem> 

@Html.DisplayNameFor(m => m.Item) 
<br /> 
@Html.DisplayNameFor(m => m.Description) 

मॉडल के प्रकार IEnumerable<T> हो गया है, के रूप में DisplayNameFor Method इस प्रकार के लिए एक अधिभार संस्करण है।

फिर अपने ध्यान में रखते हुए आप टेम्पलेट प्रदर्शित कर सकते हैं:

@Html.DisplayFor(m => m.InvoiceItems, "InvoiceItemHeader") 
@foreach (var item in Model.InvoiceItems) 
{ 
     @Html.DisplayFor(modelItem => item.Item) 
     <br /> 
     @Html.DisplayFor(modelItem => item.Description) 
     <br /> 
} 
+0

बढ़िया! सरल अहसास है कि IENumerable में ओवरलोड महत्वपूर्ण था। मैं ICollection का उपयोग कर रहा था और बस बदलते प्रकारों ने मेरे मामले में सभी अंतर किए। धन्यवाद! – McArthey

1

मैं इस प्रयास नहीं किया है, लेकिन यह काम करना चाहिए।

@Html.DisplayNameFor(modelItem => modelItem.First().InvoiceItems().First().Item) 

DisplayNameFor विस्तार विधि एक विधि इस हस्ताक्षर के साथ एक Memberexpression उम्मीद की तुलना में और कुछ नहीं है: Expression<Func<TModel, TValue>> expression

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