在MVC中绑定集合 [英] Binding collections in 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&;
< DIV>
<%的foreach(在Model.TeamMembers VAR成员)
{%GT;
< DIV CLASS =主编场>
&所述;%:Html.DropDownList(member.Type,Model.GetMemberTypes(member.MemberType.TypeId))%>
< / DIV>
< DIV CLASS =主编场>
&所述;%:Html.EditorFor(M => member.FirstName)%GT;
< / DIV>
< DIV CLASS =主编场>
&所述;%:Html.EditorFor(M => member.LastName)%GT;
< / DIV>
< DIV CLASS =主编场>
&所述;%:Html.EditorFor(M => member.Title)%GT;
< / DIV>
<%}%GT;
< / DIV>
&所述p为H.;
<输入类型=提交值=保存/>
&所述; / P>
<%}%GT;
我相信,随着一个集合中的项目相关的(当模型本身不是一个集合)的输入标签需要,然后才能有name属性的索引绑定公布的数据视图模型。下面是我平时做到这一点的方式...
<%的for(int i = 0; I< Model.TeamMembers.Count;我++){%GT;
< DIV CLASS =主编场>
<%:Html.EditorFor(M = GT; m.TeamMembers [I] .FirstName)%GT;
< / DIV>
< DIV 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屋!