在MVC中绑定集合 [英] Binding collections in MVC

查看:138
本文介绍了在MVC中绑定集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有由一个申请人对象和 TeamMember 集合的视图模型。当我发布的型号后面的团队集合总是空。我试着从我原来的 IEnumarable 更改收集到列表但这并不有所作为。所以我改变了控制器编辑操作接受的FormCollection ,并核实有在视图模型数据[member.FirstName] 。我迷路了,为什么不工作的结合。我试图尽可能多地清理我的code样品,但我在我缺少什么,我感到困惑。任何帮助是极大AP preciated!

查看模型属性

 公共类MyViewModel
{
    公共申请人ApplicantInfo {搞定;组; }
    公开名单< TeamMember> TeamMembers {搞定;组; }
}

控制器

  [HttpPost]
公众的ActionResult编辑(MyViewModel视图模型)
{
         // viewModel.ApplicantInfo的形式数据
         // viewModel.TeamMembers = NULL
}

查看

 <使用%(Html.BeginForm())
       {%GT;
    < H3>
    < A HREF =#>申请人信息与LT; / A>
    < / H3 GT&;
    <标签>
        市
        &所述;%:Html.TextBoxFor(M => Model.ApplicantInfo.City)%GT;
    < /标签>
    <标签>
        州
        &所述;%:Html.TextBoxFor(M => Model.ApplicantInfo.State)%GT;
    < /标签>    < H3>
    &所述; A HREF =#>团队及下; / A>
    < / H3 GT&;
    < D​​IV>
    <%的foreach(在Model.TeamMembers VAR成员)
    {%GT;
    < D​​IV CLASS =主编场>
        &所述;%:Html.DropDownList(member.Type,Model.GetMemberTypes(member.MemberType.TypeId))%>
    < / DIV>
    < D​​IV CLASS =主编场>
        &所述;%:Html.EditorFor(M => member.FirstName)%GT;
    < / DIV>
    < D​​IV CLASS =主编场>
        &所述;%:Html.EditorFor(M => member.LastName)%GT;
    < / DIV>
    < D​​IV CLASS =主编场>
        &所述;%:Html.EditorFor(M => member.Title)%GT;
    < / DIV>
    <%}%GT;
    < / DIV>
    &所述p为H.;
        <输入类型=提交值=保存/>
    &所述; / P>
    <%}%GT;


解决方案

我相信,随着一个集合中的项目相关的(当模型本身不是一个集合)的输入标签需要,然后才能有name属性的索引绑定公布的数据视图模型。下面是我平时做到这一点的方式...

 <%的for(int i = 0; I< Model.TeamMembers.Count;我++){%GT;
< D​​IV CLASS =主编场>
  <%:Html.EditorFor(M = GT; m.TeamMembers [I] .FirstName)%GT;
< / DIV>
< D​​IV CLASS =主编场>
  <%:Html.EditorFor(M = GT; m.TeamMembers [I] .LastName)%GT;
< / DIV>
<%}%GT;

我也用了模板,乳木果的建议,但我有一点点更code试图迫使它使支架/索引。

 <%的foreach(在Model.TeamMembers VAR成员){%GT;
  <%:Html.EditorFor(X =>
    会员,
    团队成员,
    TeamMembers [+(member.Number-1)+],
    新{MemberTypes = Model.GetMemberTypes(member.MemberType.TypeId)})%GT;
<%}%GT;

下面是一个岁,但仍从相关文章菲尔哈克的话题。

I have a View Model that consists of an Applicant object and a TeamMember collection. When I post the model back the Team collection is always null. I've tried changing the collection from my original IEnumarable to a List but that didn't make a difference. So I changed the Controllers Edit Action to accept the FormCollection, and verified there was data in viewModel["member.FirstName"]. I'm lost as to why the binding isn't working. I tried to clean out my code samples as much as possible but I'm confused at what I'm missing. Any help is greatly appreciated!

View Model Properties

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

Controller

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

View

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

解决方案

I believe that input tags associated with items in a collection (when the model itself is not a collection) need to have an index in the name attribute before you can bind posted data to a view model. Here is the way I usually accomplish this...

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

I've also used the template as suggested by Shea, but I have a tad more code trying to force it to render brackets/indexes.

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

Here is an old but still relevant article from Phil Haack on the topic.

这篇关于在MVC中绑定集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆