2010-09-14 39 views
8

yineleme ederken bir tablo biçime nesnelerin listesini oluşturur ve değerlerin düzenleme sağlayan kısmi manzarası bulunmaktadır kesinlikle yazılı yardımcıları nasıl kullanılacağı ...mvc.net listede

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBox("name",p.name) %> 
    <%: Html.ValidationMessage(p.name) %> 
    </td> 

<% } %> 

Ben mvc2'deki güçlü yazılan html yardımcılarından yararlanmak için bunu yeniden yönlendirmek istiyorum. Lambda ifadelerini nasıl oluşturacağımı anlamakta zorlanıyorum ve bazı yardımlar için umut ediyordum. Aşağıdakiler bana doğru gelmiyor.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBoxFor(???) %> 
    </td> 

<% } %> 

cevap

8

Önce bir görünümde yineleme edilmemelidir. Yineleme döngüleri anlamına gelir, döngüler C#/VB.NET, C#/VB.NET anlamına gelir, bir görünümde spagetti koduna yol açar.

Editor Templates numaralı telefonu kullanmanızı tavsiye ederim. Bu şekilde görünümlerinize döngü yazmanıza gerek yoktur. ~/Views/Home/EditorTemplates/PictureModel.ascx aşağıdaki dosya ekle: kısmi şimdi şiddetle whoozit.Models.PictureModel yerine IList<whoozit.Models.PictureModel> için yazıldığından emin

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<whoozit.Models.PictureModel>" %> 
<td> 
    <%: Html.TextBoxFor(x => x.name) %> 
    <%: Html.ValidationMessageFor(x => x.name) %> 
</td> 

Bildirimi. Şimdi bırakılır tüm ana görünümde bu kısmi dahil etmektir: Pictures ana görünümü modeline tip IList<whoozit.Models.PictureModel> bir özelliğini ise

<%: Html.EditorFor(x => x.Pictures) %> 

. Bu, koleksiyonunuzun her öğesi için kısmi olarak otomatik olarak çağırır, böylece görünümlerinize çirkin döngüler yazmanıza gerek kalmaz.

Sadece kongre çalışır: kısmi ihtiyaçlar listesi elemanlarının tip adı olarak PictureModel.ascx denilen ve ~/Views/Home/EditorTemplates veya ~/Views/Shared/EditorTemplates klasörde bulunması için.

Editör/Ekran şablonları görünümlerinizi çok daha zarif hale getirecektir.

Açıklama: .NET'te sözleşme, büyük harfle başlayacak özellik adlarıdır; bu nedenle name özelliğini Name olarak yeniden adlandırmanızı öneririz.

<%: Html.TextBoxFor(x => x.Name) %> 
1
<%= Html.TextBoxFor(p => p.name) %> 
+0

bu isimde bir tanım içermiyor IList ' bir hata veriyor ...'p' değişkeni List türünde ve Resim değil, bu yüzden ad alanına erişemiyorum – yamspog

1

Sen whoozit.Models.PictureModel öğelerin listesini beklemek için kısmi görünümü anlatıyorsun. Sonra foreach senin whoozit.Models.Picture değil PictureModel arıyor. Aşağıda normalde böyle bir şey yapacağım. Numaralandırmaya çalıştığınız Listenin doğru türde olduğundan emin olun. Resim sınıfı PictureModel içindeki bir koleksiyondan geliyorsa, Model yaptığınızdan emin olun. Foreach'da ne olursa olsun.

bu deneyin: Herşeyden

<% foreach(var p in Model) { %> 
<td> 
<%: Html.TextBoxFor(p => p.name) %> 
<%: Html.ValidateFor(p => p.name) %> 
</td> 
<% } %> 
2

Sen döngü için birlikte modelin döngü tarafından kesinlikle yazılı yardımcı yöntemleri kullanabilirsiniz: Sadece yazmak ve okumak için daha doğal hissediyor. Bu, aynı zamanda "isim" html özniteliğini benzersiz hale getirecektir, bu nedenle model bağlayıcısı, değerleri bir kurtarma durumunda modelinize geri döndürmenize yardımcı olabilir.

<% for (int i = 0; i < Model.Count; i++) { %> 

    <%: Html.TextBoxFor(m => m[i].Name) %> 
    <%: Html.TextBoxFor(m => m[i].SomethingElse) %> 

<% } %> 

Devamı burada .. http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

İlgili konular