MVC 4

2013-03-26 29 views
6

içinde denetimler ve gönderme formu (Html.BeginForm) olan her döngü için benim görünüm modelimde, bir nesne listesi var. Bu nesneleri yineliyorum ve her biri için kontroller oluşturuyorum. Aşağıdaki durumda, insanlara her nesne için bir metin kutusu ve bir düğme göstermek istiyorum. Kullanıcı düğmeyi tıkladığında, bir gönderi yapılır ve verileri kontrolöre kaydedebilirim. Kullanıcı Arabiriminde, kullanıcı istediği formu değiştirebilir ve kaydet'i tıklatabilir.MVC 4

 using (Html.BeginForm()) 
     { 
      foreach (var contributor in Model.Contributor) 
      { 

     @Html.HiddenFor(model => contributor.Id) 

     <div class="formrow"> 
      @Html.ValidationSummary(true) 
     </div> 

     <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
     <div class="formrow"> 

      @Html.EditorFor(model => contributor.FirstName) 
      <div class="formvalidation"> 
       @Html.ValidationMessageFor(model => contributor.FirstName) 
      </div> 
     </div> 


     <div class="formrow right"> 
      <input type="hidden" name="formsubmitted" value="true" /> 
      <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
     </div> 
      } 
     } 

Bence modeli kodu

public class ProfileModel 
{ 
    public string Message { get; set; } 
    public List<PublisherModel> Publisher { get; set; } 
    public List<ContributorModel> Contributor { get; set; } 

    public ContributorModel NewContributor { get; set; } 
} 

:

Sorunum

Benim Jilet kodu .. o kontrolöre Gönderilen modeli null olduğu Denetleyici kodum

[HttpPost] 
public ActionResult Mine(ProfileModel model, string newuser) 
{ 
    // 
} 

Nasıl düzeltilir?

Görünüm modelimi, değişiklikleri bir şekilde saklamanın bir yolu ile genişletmem gerekiyor. Ama nasıl olduğunu gerçekten göremiyorum.

Şu anda ProfileModel'deki tüm özellikler denetleyiciye ulaştığında boştur.

Herhangi bir fikrin var mı?

+0

hala boş midir? –

+0

"@ Html.EditorFor (model => contributor.FirstName) için oluşturduğunuz html dosyanızı yayınlayabilir misiniz? –

+0

Somethings tam olarak orada görünmüyor, VIEW içindeki model ContributorModel Listesi'dir, ancak yayınlanan model (HttpPost) ProfileModel? Onun düzenleme/görüntüleme ile aynı model türü değil! – Zeddy

cevap

14

Temel olarak sorun, varsayılan model bağlayıcı öğesinin koleksiyon öğelerini foreach döngüsünde doğru şekilde bağlayamamasıdır. Başka bir deyişle, öğeyi hatalı olarak adlandırır ve bu nedenle koleksiyonda parametreler boş olarak görüntülenir.

Farklı türden geçici çözümlerin, yardımcıların ve malzemelerin var olduğundan eminim ancak bunlara aşina değilim, bu yüzden foreach yerine döngü için kullanıyorum, bu şekilde öğeler doğru şekilde adlandırıldı.

bu deneyin:

@for (int i = 0; i < Model.Contributor.Count(); i++) 
    { 

     @Html.HiddenFor(model => Model.Contributor[i].Id) 

     <div class="formrow"> 
      @Html.ValidationSummary(true) 
     </div> 

     <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
     <div class="formrow"> 

      @Html.EditorFor(model => Model.Contributor[i].FirstName) 
      <div class="formvalidation"> 
       @Html.ValidationMessageFor(model => Model.Contributor[i].FirstName) 
      </div> 
     </div> 


     <div class="formrow right"> 
      <input type="hidden" name="formsubmitted" value="true" /> 
      <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
     </div> 
    } 

sizin durumunuzda onlar Katılımcı gibi görünmelidir, elementler doğru ad özniteliği varsa görmek için bir hata ayıklama aracı kullanmak için önermek [0] .kimlik, Katılımcı [0]. İlk Ad vb.

+1

Son zamanlarda neredeyse tam olarak böyle bir şey yaptım; model bağlayıcı, her nesne için bir dizin göremediğinde bir listeye bağlanamaz; dolayısıyla, [Contributor]. Eğer for döngüsünü sevmiyorsanız, foreach da var (bazı şeyler var: "SomeCollection.Select ((x, i) => new {Value = x, Index = i}))" size "thing" verir. 'Döngüdeki indis olarak (for döngüsünde 'i') ve nesne olarak' thing.Value'. – anaximander

+0

Bu çözümü düşünmezdim .. Çok teşekkürler! Gerçekten çok yardımcı olur :-) –

+0

komik şey, görsel stüdyo for-loop foreach döngüsüne dönüştürmemi önerir ve sonra kod yayınlandıktan sonra veri doğru bir şekilde bağlanmadığından çalışmayı durdurur – Dario

5

Contributor nesnesi için PartialView öğesini kullanabilirsiniz. PartialView:

@model Contributor 
using (Html.BeginForm("ContributorUpdate", "YourController")) 
{ 
    @Html.HiddenFor(model => Model.Id) 
    <div class="formrow"> 
    @Html.ValidationSummary(true) 
    </div> 

    <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
    <div class="formrow"> 

    @Html.EditorFor(model => Model.FirstName) 
    <div class="formvalidation"> 
     @Html.ValidationMessageFor(model => Model.FirstName) 
    </div> 
</div> 
<div class="formrow right"> 
    <input type="hidden" name="formsubmitted" value="true" /> 
    <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
</div> 
} 

Görüntüle olacaktır:

@foreach (var contributor in Model.Contributor) 
{ 
    @{Html.RenderPartial("Conributor", contributor);} 
} 

Ve kontrolör kodu: aswell dize mesajı göndermek eğer

[HttpPost] 
public ActionResult Mine(Conributor conributor, string newuser) 
{ 
    // 
}