2016-04-04 27 views
2

Çocukların görünüm modellerinin bir listesini içeren bir üst görünüm modelim var (Arayalım ParentViewModel) (Onlara ChildViewModel diyelim). Her çocuk görüntüleme modeli bağımsız olarak düzenlenebilir ve bir döngüde görüntülediğim ayrı bir formum var. Bu harika bir şekilde çalışıyor ancak çocuk modelini nasıl yayınlayacağımı ve ebeveynleri görmezden gelemem. MVC Post A Denetleyiciye bir Çocuk modeli

Bu

benim biçimidir:

@model ParentViewModel 

...

@foreach (var child in Model.Children) 
{ 
    @using (Html.BeginForm("_EditChild", "Admin", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 
     <div class="form-group"> 
      @Html.EditorFor(model => child.Content, new {htmlAttributes = new {@class = "form-control"}}) 
      @Html.ValidationMessageFor(model => child.Content, "", new {@class = "text-danger"}) 
     </div> 
     <div class="form-group"> 
      <div class="col-md-12"> 
       <input type="submit" value="Create" class="btn btn-default new-post" /> 
      </div> 
     </div> 
    } 
} 

Ve bu benim kumandanın imzadır. ParentViewModel'de liste halinde bulunan bir ChildViewModel türü bekleniyor.

[Authorize] 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult _EditPost([Bind(Include = "")] ChildViewModel childViewModel) 
{ 

} 

Form çalışıyor ve gönderen BUT ChildViewModel, gönderen denetleyiciye ulaştığında boştur. Bu kesinlikle, Form Gönderi ile Eylem arasındaki bağın gerçekleşmemesidir.

+1

BeginForm çağrısında _EditChild nedir? – skalinkin

+0

@using daha yüksek olabilir mi? * @ using ... @ foreach ... ** –

+0

İlk önce "foreach" döngüsünde form kontrolleri oluşturamazsınız ([bu yanıtı okuyun] (http://stackoverflow.com/questions/30094047/html-table-to -ado-net-datatable/30094943 # 30094943) bir açıklama için). Ancak her seferinde yalnızca bir form gönderebilirsiniz, böylece her bir öğe için bir form oluşturmanın anlamı yoktur.Tüm denetimleri tek bir biçimde oluşturun, böylece tüm değişiklikleri bir kerede düzenleyebilir ve geri yükleyebilir ya da alt öğelerinizi düzenlemek için başka bir sayfaya bağlantı sağlayabilirsiniz. –

cevap

2

Sayfa modelini yalnızca tanımlamanız mümkün değil, çünkü sayfa tanımladığınız ana model olan tek bir modeli tanımlayabilir.

Ancak, sorununuzu yalnızca ana modeli yayınlayarak ve denetçiye alt modelini ayıklayarak çözebilirsiniz.

0

Bu, ASP.NET MVC tarafından tasarlanmamıştır. Tek yapmanız gereken, ana öneki, müşteri tarafındaki gönderilmiş girişlerinizin adından kaldırmanızdır. Girişiniz muhtemelen benzer görünümde olacaktır:

<input name="SomeProperty" ../> 

ve model bağlayıcı yapmalıdır:

sizin AdminController._EditChild eylem ChildViewModel bekliyor
<input name="Children[0].SomeProperty" ../> 

, o zaman sadece girdi adlandırmak için javascript kullanmak zorunda kalacak ChildViewModel'i oluşturun. Alternatif olarak, girdilerinizi yanlış bir ön ekine sahip olsa bile bir ChildViewModel'e eşleyen bir özel ValueProvider veya ModelBinder oluşturarak da çözebilirsiniz ... ancak bu, giriş adlarını değiştirmekten ziyade bir uglier hack gibi görünebilir. Bu notta, sadece adın ciltleme için kullanılmasına rağmen, adlarını yalnızca eşitlemede tutmak için güncelleştirirken javascript ile kimlik bilgilerini de güncelleştiririm. Eğer döngü ama sadece modelin tek çocuğu ViewModel göndermek istemiyor eğer

Not ayrıca, sadece bir değişkene atayabilirsiniz:

@var childVM = Model.ChildProp; 
@Html.HiddenFor(m => childVM.ID) 

Bildirimi m mülkiyet ifadesinde göz ardı edilmektedir HiddenFor.

public ActionResult SomeAction(ChildViewModel childVM){ ... } 

Şu anda why this technique can't be combined with looping anlamaya çalışıyorum: ben yaptım son kez bu değişken adı bu sunacağını böylece eylemin parametre adını eşleşecek şekilde olduğunu düşünüyorum.

İlgili konular