如何在MVC3中的回发上获取viewmodel上的子集合?

时间:2011-11-03 12:53:22

标签: c# asp.net-mvc asp.net-mvc-3 viewmodel

Phil Haack有一篇文章描述了如何进行设置,以便默认模型绑定器将绑定到帖子背面的集合:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

我遇到的问题是我不只是尝试将一个集合发送回Controller操作,而是一个带有集合的ViewModel。

我有一个基本上看起来像这样的课程:

public class MyViewModel
{
public int IncidentNumber { get; set; }
public string StoreId { get; set; }
public string RepId { get; set; }
public string OrderStatus { get; set; }
public CustomerViewModel Customer { get; set;
//... other properties and SelectLists for binding

public IEnumerable<OrderItemViewModel> OrderItemViewModels { get; set; }

我实际上可以在回发中获取CustomerViewModel数据,但OrderItemViewModels列表为空。我如何取回这些?菲尔的文章没有帮助那里。

2 个答案:

答案 0 :(得分:5)

我在这里有一个类似的问题MVC binding to model with list property ignores other properties,它通过在视图中使用以下代码来解决

<div class="editor-field">
@for (int i = 0; i < Model.MyCollection.Count(); i++)
{
    @Html.HiddenFor(m => m.MyCollection[i].Id)
    @Html.HiddenFor(m => m.MyCollection[i].ParentId)
    @Html.HiddenFor(m => m.MyCollection[i].Name)
    @Html.TextBoxFor(m => m.MyCollection[i].Value)
}
</div>

答案 1 :(得分:1)

使用编辑器模板:

@model MyViewModel
@using (Html.BeginForm())
{
    ... some input fields 

    @Html.EditorFor(x => x.OrderItemViewModels)

    <input type="submit" value="OK" />
}

然后在相应的编辑器模板中,该模板将自动为OrderItemViewModels集合(~/Views/Shared/EditorTemplates/OrderItemViewModels.cshtml)的每个元素呈现:

@model OrderItemViewModels
<div>
    @Html.LabelFor(x => x.Prop1)
    @Html.EditorForFor(x => x.Prop1)
</div>
<div>
    @Html.LabelFor(x => x.Prop2)
    @Html.EditorForFor(x => x.Prop2)
</div>
...