Eğer

2013-05-22 27 views
19

nasıl iç içe bir modelde DisplayNameFor erişebilirim iç içe bir modelde DisplayNameFor erişmek nasıl - yani .:Eğer

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; } 
} 

Ben iç içe öğeler arasında döngü aşağıdaki gibi:

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

Ama nasıl gidebilirim: [Display(Name = "Item Heading")]

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

hatayı alıyorum: '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

Teşekkürler, Mark

Burada döngü içinde item erişiyorsunuz

cevap

31

: Bu ve evlilerin

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

Değiştir: sen değilsin burada

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

Ama Çalışır:

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

modelItem, Invoice türündedir (model görünümüne geçirilmiştir), ancak döngüde (döngü yineleyicisinden) türünde InvoiceItem türünü kullanmak istersiniz.

Yan not: "öğesini" her şey çağrılmadı eğer böyle bir şey Ayıklama bir çok daha kolay olabilir Net adlandırma önemlidir :)

Düzenleme: Döngü dışında erişiyorsanız, o zaman el ile modele inmek gerekir. Böyle bir şey: hiçbir öğe varsa .First() istisna atabilir beri

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

O , bu tehlikeli olurdu gibi hissediyor. Ancak, yorumlar belirtildikçe ve bazı usta Googling'in onayladığı görüldüğü gibi, .First(), bu durumda çalışma zamanında çalıştırılan aslında değildir. Bu, .DisplayNameFor()'un mülkiyete yansımasını sağlamak için sadece bir hile.

+0

Vay be, ben :))) dürüstçe birkaç dakika için ona bakıyordu, bunu hiç fark ederdi –

+0

Hi - point takere isimleri - ancak ben döngü girmeden önce DisplayNameFor göstermek istiyorum. Şu anda önerildiği gibi değiştirirseniz, "Ad 'öğesi' geçerli bağlamda mevcut değil" - teşekkürler, Mark – Mark

+1

@ fixit: Döngü bağlamının dışında, tamamen farklı bir hikaye. ModelItem.InvoiceItems.First(). Item' gibi bir şeyi deneyebilirsiniz. _Might_, 'DisplayNameFor' aslında nasıl çalıştığına bağlı olarak liste boşsa bir istisna atar. (İçine hiç bakmadım.) – David

3

Sen "InvoiceItemHeader" demek, senin InvoiceItems için DisplayTemplate oluşturabilirsiniz: modelinin

@model IEnumerable<InvoiceItem> 

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

tip IEnumerable<T> olmalı, DisplayNameFor Method bu tip bir aşırı yük sürüme sahip olarak.

Sonra görünümünde şablonu görüntüleyebilirsiniz: Bunu denemedim

@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

Harika! IEnumerable 'un aşırı yüklenmeye sahip olmasının basit olması önemliydi. ICollection kullanıyordum ve yalnızca değişen türler benim durumumdaki tüm farkları yaratıyordu. Teşekkürler! – McArthey

1

, ancak çalışması gerekir.

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

DisplayNameFor uzatma yöntemi Bu imza ile Memberexpression bekliyor bir yöntem başka bir şey değildir: Expression<Func<TModel, TValue>> expression