2011-02-09 64 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应该处理所有事情,并将其发回给你的视图模型。