2013-03-26 32 views
6

在我的視圖模型中,我有一個對象列表。我迭代這些對象,併爲它們中的每一個創建控件。在下面的情況下,我想向人們展示每個對象的文本框和按鈕。當用戶點擊按鈕時,會發布帖子,我可以將數據保存在我的控制器中。對於MVC 4中控件和提交表單(Html.BeginForm)的每個循環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> 
      } 
     } 

我的視圖模型代碼

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; } 
} 

我的控制器代碼

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

如何解決?

我想我必須展開我的視圖模型,以某種方式存儲更改。但我真的不知道如何。

現在ProfileModel中的所有屬性在到達控制器時都爲空。

任何想法?

+0

這還算空,如果你發佈字符串消息藏漢? – 2013-03-26 11:56:47

+0

你可以發佈你的HTML爲'@ Html.EditorFor(model => contributor.FirstName)提供'' – 2013-03-26 12:04:17

+0

Somethings不看正確的地方,VIEW中的模型是ContributorModel列表,但發佈的模型(HttpPost)是ProfileModel?它與您的編輯/觀看不一樣的模型類型! – Zeddy 2013-03-26 11:50:58

回答

14

基本上問題在於默認模型聯編程序無法在foreach循環中正確綁定收集項目。換句話說,它不正確地命名元素,這就是爲什麼集合在參數中顯示爲空。

我確定有各種不同的解決方法,幫助和東西,但我不熟悉這些,所以我只是使用for循環而不是foreach,這樣元素被正確命名。

試試這個:

@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> 
    } 

我建議你使用的調試工具,看看元素具有正確的名稱屬性,在你的情況下,他們應該像貢獻者[0] .ID,投稿[0]。名字等

+1

我最近做了幾乎完全一樣的東西;如果模型聯編程序無法查看每個對象的索引,則無法綁定到列表,因此需要'Contributor [i]'。如果你不喜歡for循環,那麼還有'foreach(someCollection.Select((x,i)=> new {Value = x,Index = i})中的var事件)''這會給你'thing.Index '作爲循環中的索引(代替for循環中的'i')和'thing.Value'作爲對象。 – anaximander 2013-03-26 12:05:04

+0

我不會想到這個解決方案..非常感謝!真的有幫助:-) – 2013-03-26 12:44:09

+0

有趣的是,Visual Studio建議我將for循環轉換爲foreach循環,然後代碼停止工作,因爲數據發佈後沒有正確綁定 – Dario 2017-07-05 13:22:11

5

您可以使用PartialView作爲Contributor對象。 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> 
} 

景觀將是:

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

和控制器代碼:

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