2011-02-09 130 views
4

我有一個查看模型,它由一個Applicant對象和一個TeamMember集合組成。當我發回模型時,Team集合始終爲空。我試過將原來的IEnumarable改爲List,但這並沒有什麼區別。因此,我將控制器編輯動作更改爲接受FormCollection,並驗證viewModel["member.FirstName"]中有數據。我迷失了爲什麼綁定不起作用。我試圖儘可能清理我的代碼示例,但我對我錯過的東西感到困惑。任何幫助是極大的讚賞!在MVC中綁定集合

查看模型屬性

public class MyViewModel 
{ 
    public Applicant ApplicantInfo { get; set; } 
    public List<TeamMember> TeamMembers { get; set; } 
} 

控制器

[HttpPost] 
public ActionResult Edit(MyViewModel viewModel) 
{ 
     // viewModel.ApplicantInfo has the form data 
     // viewModel.TeamMembers = null    
} 

查看

<% using (Html.BeginForm()) 
     {%> 
    <h3> 
    <a href="#">Applicant Information</a> 
    </h3> 
    <label> 
     City 
     <%: Html.TextBoxFor(m => Model.ApplicantInfo.City)%> 
    </label> 
    <label> 
     State 
     <%: Html.TextBoxFor(m => Model.ApplicantInfo.State)%> 
    </label> 

    <h3> 
    <a href="#">Team</a> 
    </h3> 
    <div> 
    <% foreach (var member in Model.TeamMembers) 
    { %>   
    <div class="editor-field"> 
     <%: Html.DropDownList("member.Type", Model.GetMemberTypes(member.MemberType.TypeId))%> 
    </div> 
    <div class="editor-field"> 
     <%: Html.EditorFor(m => member.FirstName)%> 
    </div> 
    <div class="editor-field"> 
     <%: Html.EditorFor(m => member.LastName)%> 
    </div> 
    <div class="editor-field"> 
     <%: Html.EditorFor(m => member.Title)%> 
    </div>    
    <%} %> 
    </div> 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
    <% } %> 

回答

5

我相信與集合中的項目相關聯的輸入標記(當模型本身不是集合​​時)需要在name屬性中有一個索引,然後才能將發佈的數據綁定到視圖模型。下面是我通常做到這一點,我還使用了模板,乳木果所建議的方式......

<% for (int i=0; i<Model.TeamMembers.Count; i++) { %> 
<div class="editor-field"> 
    <%: Html.EditorFor(m => m.TeamMembers[i].FirstName)%> 
</div> 
<div class="editor-field"> 
    <%: Html.EditorFor(m => m.TeamMembers[i].LastName)%> 
</div> 
<% } %> 

,但我有一點點更多的代碼試圖迫使它使支架/索引。

<% foreach (var member in Model.TeamMembers) { %> 
    <%: Html.EditorFor(x => 
    member, 
    "TeamMember", 
    "TeamMembers["+(member.Number-1)+"]", 
    new { MemberTypes = Model.GetMemberTypes(member.MemberType.TypeId) })%> 
<% } %> 

這是來自Phil Haack的關於該主題的old but still relevant article

+0

我很確定,當我實現我的模板時,我不需要擔心強制索引顯示等。我相信,當你在列表上使用EditorFor,並且你有一個單獨項目的編輯器模板它構成了列表,它會自動迭代並處理綁定等。 – 2011-02-10 01:54:26

1

嘗試使用這樣的:

<%: Html.EditorFor(m => m.TeamMembers) %> 

然後,使與TeamMember模型類型的共享編輯模板。 MVC應該處理所有事情,並將其發回給你的視圖模型。