2012-11-19 14 views
5

Görünümümde görüntülenen öğeler listem var. Bu listeye UI'den bir ekle düğmesiyle öğeleri manuel olarak ekleyebilmem gerekir. Yeni öğenin görüntülenmesini sağlamak için javascript ile kısmi bir görünüm yüklemem gerektiğini biliyorum. Benim Öğe bir TextBox ve Kodları doldurulan bir DropDownList, hem içerdiği içinTek bir kısmi birden çok nesne gerektirdiğinde, görünümlerimi koleksiyonuma dinamik olarak nasıl ekleyebilirim?

@{var count = 0;} 
@foreach (var dx in Model.Patient.DxList) 
{  
    <div class="form-field"> 
     <label>@(++count)</label> 
     @Html.HiddenFor(d => dx.DxIndex) 
     @Html.TextBoxFor(d => dx.Dx, new { @class = "small" }) 
     <span class="description">@((dx.DxRef != null) ? dx.DxRef.Title : "")</span> 
     @Html.DropDownListFor(d=> dx.Indicator, new SelectList(Model.Codes, "Value", "Description", dx.Indicator), "Please select", new { @class = "" }) 
    </div> 
} 

Ancak, benim kısmi görünümü ViewModel çok ihtiyacı var? Sadece Dx'i değil, listeyi oluşturmak için uygun Kodların listesini de içermek mi?

public class DxSingleViewModel 
{ 
    public Dx Dx { get; set; } 
    public List<Code> Codes { get; set; } 
} 

Bu genel bir yaklaşım mı, yoksa üssü kapalı mıyım diye bir fikriniz yok.

cevap

2

ayrı bir kısmi görünümü/editör şablonuna bir öğe oluşturulmasını ayırmak ve foreach döngüsü içine diyoruz, bu nedenle tek bir öğe için işaretleme tanımlayan tek bir yerde jsut olmalıydı:

@foreach (var dx in Model.Patient.DxList) 
{ 
    @Html.EditorFor(m => dx) 
} 

Sonra AddNewItem eylem ekleme ve dinamik satırları çıkartırken sadece @Html.EditorForModel()

çağıran kısmi bir görünüm iade edebilir, çarpışmaları önlemek için öğeleri kendi indeksi (örneğin bir guid dizesi) gömmek gerekir. Özel bir html helper ile bu kurulumu anlatılmıştır bu büyük makaleye göz atın: http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

böyle görünecek EditorTemplate:

@using (Html.BeginCollectionItem("DxList")) 
{ 
    @Html.TextBoxFor(d => dx.Dx, new { @class = "small" }) 
    .... 
} 

ViewModel için liste içermelidir olup olmadığı hakkında soru ile ilgili olarak açılır listeniz veya değil: Viewmodel, görünümü oluşturmak için ihtiyacınız olan her veriyi içermelidir. Yani evet derdim, listeye geçmek için iyi bir yer.

Bunun sebebi de onu viewbag'da da geçirebiliyorsunuz, ancak güçlü yazılan veri çantalarının bir arkadaşıyım, bu yüzden viewmodel'i tercih ederim.

+0

tipiyle kısmi görünümü daktilo güzel ve basit bir çözüm gibi görünüyor. Ancak, bu yaklaşımın koleksiyon bağlama için doğru giriş adlarını oluşturacağından emin misiniz (örn. Patient.DxList [0] .DxIndex)? – mipe34

+0

Evet, bu dizinleri oluşturacaktır, ancak dinamik olarak satır eklemek ve çıkarmak istediğinizde kendi indeksinizi kullanmalısınız. Cevabımı güncelleyeceğim. – Jan

+0

Güzel. Bu Html.BeginCollectionItem yardımcılarının farkında değildim – mipe34

0

Bu yaklaşımı deneyebilirsiniz. Otomatik ciltleme için doğru giriş ismini oluşturmak için mülkün ismini (yolunu) hatırlamanız gereken bir dezavantajı vardır (bu sayede, yeniden hesaplama aracıyla kolayca değiştiremezsiniz).

Görünüm

@foreach (int i=0;i < Model.Patient.DxList.Count;i++) 
{ 
    @{Html.RenderPartial("PartialDx", Model.Patient.DxList[i] ,new ViewDataDictionary() { {"count",i}});} 
} 

PartialView-kuvvetle DxSingleViewModel

@{string collectionName = string.Format("Patient.DxList[{0}].", ViewBag.count);} 

<div class="form-field"> 
    <label>@{ViewBag.count + 1}</label> 
    @Html.Hidden(collectionName+"Dx.DxIndex", Model.Dx.DxIndex) 

</div> 
İlgili konular