2013-08-02 51 views
2

我已经做了这方面的一些研究,似乎发现是过期或在我的情况不太工作岗位。我虽然可以在搜索时使用错误的关键词... =/MVC 4绑定列表的嵌套列表导致

在我的网页我有一个包含包含行又包含项目组盒标签。 所以它是列表4个级别的列表。

问题:

当回发,ViewModel.Tabs为空,我不能保存任何。 所有内容都显示得非常好,但没有任何内容可以发回。

代码

查看/共享/ EditorTemplates/Tab.cshtml

@model AWMCCRM.Web.ViewModels.Tab 

@Html.HiddenFor(vm => vm.Name) 
<div id="[email protected](" ", string.Empty)" class="tab-content two"> 
    @Html.EditorFor(vm => vm.Groups) 
</div> 

查看/共享/ EditorTemplates/Group.cshtml

@model AWMCCRM.Web.ViewModels.Group 
@Html.HiddenFor(vm => vm.Name) 
<fieldset> 
    <legend>@Model.Name</legend> 
    @Html.EditorFor(vm => vm.Lines) 
</fieldset> 

查看/共享/EditorTemplates/Line.cshtml

@model AWMCCRM.Web.ViewModels.Line 
<div class="_100Max"> 
@Html.HiddenFor(vm => vm.Name) 
@Html.EditorFor(vm => vm.Items) 
</div> 

查看/共享/ EditorTemplates/Item.cshtml

@model AWMCCRM.Web.ViewModels.Item 

<div class="[email protected]" title="@Model.Description"> 
    <p> 
     @Html.HiddenFor(x => x.DataType) 
     @Html.HiddenFor(x => x.Description) 
     @Html.HiddenFor(x => x.DisplaySize) 
     @Html.HiddenFor(x => x.DisplayType) 
     @Html.HiddenFor(x => x.IDsPiped) 
     @Html.HiddenFor(x => x.ItemType) 
     @Html.HiddenFor(x => x.Name) 

     @Html.LabelFor(vm => vm.Value, Model.Name) 
     @switch (Model.DisplayType.ToLower().Replace(" ", string.Empty)) 
     { 
      case "checkbox": 
       @Html.CheckBoxFor(vm => Convert.ToBoolean(vm.Value)) 
       break; 
      case "dropdownlist": 
       @Html.DropDownListFor(vm => vm.Value, Model.ValueOptionListItems) 
       break; 
      case "multiselectlist": 
       @Html.ListBoxFor(
        x => x.SelectedValueList, 
        Model.ValueOptionListItems, 
       new { id = "itemValuesMultiSelect", multiple = "multiple", Size = 15 }) 
       break; 
      case "radiobutton": 
       @Html.RadioButtonFor(vm => vm.Value, Model.Value) 
       break; 
      case "textarea": 
       @Html.TextAreaFor(vm => vm.Value) 
       break; 
      default: 
       @Html.TextBoxFor(vm => vm.Value) 
       break; 
     } 
    </p> 
</div> 

的视图模型(削减版本)

namespace AWMCCRM.Web.ViewModels 
{ 
    public class PersonEditViewModel 
    { 
     public List<Tab> Tabs { get; set; } 

     //Other properties 
     //... 

    } 
} 

的视图(削减版本)

@using (Html.BeginForm("Edit", "Person", FormMethod.Post, new { id = "validate-form", @class = "block-content form" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(x => x.PersonID) 
    @foreach (var tab in Model.Tabs) 
    { 
     @Html.EditorFor(vm => tab) 
    } 
    <input class="close-toolbox button" type="submit" value="Save"> 
} 

有什么建议?

感谢

回答

4

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

这是一个老的文章,但它仍然适用。

我有这个确切的问题,但基本上是由于模型绑定系统,您需要使用显式的for循环,而不是一个foreach循环,并通过它们的索引引用您的元素。

@using (Html.BeginForm("Edit", "Person", FormMethod.Post, new { id = "validate-form", @class = "block-content form" })) 
{ 
    Html.AntiForgeryToken() 
    Html.HiddenFor(x => x.PersonID) 
    for (int i = 0; i<Model.Tabs.Count; i++) 
    { 
     Html.EditorFor(x => Model.Tabs[i]) 
    } 
    <input class="close-toolbox button" type="submit" value="Save"> 
} 
+0

完美!它的工作原理,谢谢。 – PostureOfLearning