2016-03-30 21 views
3

Bu zor bir soru olabilir, ama işte gidiyor.Kısmi görünüm viewmodel öğelerini Razor ile ana görünüm viewmodel'de nasıl kaydedebilirim?

Bakalım ana görüşüm var ve buna MainView.cshtml diyelim.

Şimdi MainView.cshtml özel bir ViewModel sınıfının ExampleItem bir IEnumerable değişken Model.ExampleItems tutan MainViewModel.cs denilen vardır.

Şimdi ViewModel yalnızca ExampleItem10 olan _PartialView.cshtml adlı kısmi görünümüm var.

Tamam, burası nerede takılıyorum. MainView.cshtml, _PartialView.cshtml numaralı telefonu dinamik olarak arayarak kullanıcının ExampleItem numaralı telefonunu oluşturabilmesini sağlar. Her kullanıcı tarafından oluşturulan ExampleItem'u MainViewModel'un IEIumerable of ExampleItems'e nasıl kaydederim? İşte

orijinal Model.ExampleItems içine

MainView.cshtml

@model Models.ViewModels.MainViewModel 

@foreach (var item in Model.ExampleItems) 
{ 
    await Html.RenderPartialAsync("_PartialView", item); 
} 

<button id="AddExampleItem" type="button" class="btn btn-primary">Add Example Item</button> 

_PartialView.cshtml

@model Models.ExampleItem 

<input asp-for="VariableOne" /> 
<input asp-for="VariableTwo" /> 
<input asp-for="VariableThree" /> 

nasıl kurtarabilir bazı örnek kod ^^^ bu nedir?

+0

'Örn. Örneklerin çoğu, sorgu için esastır ... kaydetmek için, muhtemelen bir 'List' veya bir veritabanı tablosu istersiniz. Kullanıcınız '_PartialView.cshtml'inizde' ExampleItem 'oluşturduğunda her zaman DB'de saklayın. Sonra, ExampleItems'inizi her aldığınızda, yalnızca DB tablosundan sorgulamanız gerekir. – Ian

+0

'Öğe ekle'yi nerede yapmak istiyorsunuz? istemci tarafı veya sunucu tarafı? – Dandy

+0

@Dandy Bu bölümü eklemeyi unuttum. Bu bir formda sarılmış ... temelde kullanıcı tüm yeni ExampleItems'i ekledikten sonra, gönderebildikten sonra dış db'ye kaydedilebilir. Ancak, ÖrnekItems POST üzerindeki denetleyiciye geri iletildiğinde, boş bir listedir – Daath

cevap

1

Burada iki yolunuz var. Her iki şekilde de, postalanan ExampleItem s bağlantılarını yapmak için, form alanları ExampleItems[N].Property biçiminde adlandırılmalıdır. Yani, bunu başarmak için yapabileceğiniz: yerine bir foreach daha

  1. kullan for döngü ve geçiş bir HtmlFieldPrefix:

    @foreach (var i = 0; i < Model.ExampleItems; i++) 
    { 
        var viewData = new ViewDataDictionary(ViewData); 
        viewData.TemplateInfo.HtmlFieldPrefix = "ExampleItems[" + i.ToString + "]"; 
        await Html.RenderPartialAsync("_PartialView", Model.ExampleItems[i]); 
    } 
    

    Ayrıca ExampleItems bir List<ExampleItem> ziyade yapmak gerekir IEnumerable<ExampleItem> veya iki kez numaralandırma için bir istisna (sayın ve sonra döngü için).

  2. ExampleItem için bir editör şablonu oluşturun ve EditorFor'u kullanın. Sadece ~/Views/Shared/EditorTemplates/ExampleItem.cshtml'da bir görünüm oluşturun ve kısmi kodunuzu buraya koyun. Sonra ana görünümde sadece yapardın:

    @Html.EditorFor(m => m.ExampleItems) 
    

    Jilet akıllıca bunu bir koleksiyon geçti belirlemek ve koleksiyonunda her öğe için editör şablonu hale getirecek. Ayrıca, önemli olarak, koleksiyonun tam bağlamına sahip olacak, bu yüzden her şey postayla doğru şekilde bağlanacak şekilde uygun ad önekleri kullanacaktır.

+0

Bu, editör şablonlarından bahsetmek için harika bir fırsat - Onları tamamen unutmuştum. Bu harika çalıştı ve sahip olduğum foreach döngüsünden çok daha temiz görünüyor. Ancak, orijinal Örnek Öğeleri listesine yeni bir Örnekle ekleme hakkında nasıl giderim? Formu gönderirken, yeni ExampleItem (ler) i tamamen indirilir – Daath

+0

Yeni bir öğenin alanlarını JavaScript aracılığıyla dinamik olarak eklediğiniz varsayılıyor ve tahmin etmem gerekirse, muhtemelen bir AJAX isteği ile kısmi getiriyor. Bu durumda, alan adları düzgün bir şekilde önlenmez, bu nedenle model bağlayıcı bunları atar. Alanlarınızı oluşturmak için Knockout veya Angular gibi bir şey kullanmanızı öneririm. Böylece, bir JavaScript dizisindeki yerlerine göre girdilerin ad niteliklerini doğru şekilde dizine ekleyebilirsiniz. –

+0

Ugh evet Sadece haklı göründüm. Daha önce hiç kullanmadım, bu yüzden Knockout'a bir göz atacağım. Yardımın için teşekkürler dostum. Ben devam edip bunu cevap olarak işaretleyeceğim – Daath