Passar objects da lista com o MVC Razor

Eu estou usando um object, mas dentro de object eu tenho uma propriedade que é uma lista de objects. Eu quero passar esse object com os objects de lista dentro dele, mas a lista está vazia quando eu envio meu formulário. Não sei como lidar com isso.

Classe

public class VSTAttendance { public int MemberID { get; set; } public string Name { get; set; } public string Surname { get; set; } public bool Attendant { get; set; } } public class ServiceAttendance { public int AttendanceID { get; set; } public int AttendanceTypeID { get; set; } public string AttendanceType { get; set; } public DateTime Service { get; set; } public int ServiceID { get; set; } public string Speaker { get; set; } public string Location { get; set; } public int HeadCount { get; set; } public int CategoryID { get; set; } public string Description { get; set; } public string ChurchNotes { get; set; } public string ServingNotes { get; set; } public DateTime DateCreated { get; set; } public DateTime CreatedBy { get; set; } public DateTime DateUpdate { get; set; } public DateTime UpdateBy { get; set; } public List MemberAttendance { get; set; } } 

HTML

 @using (Html.BeginForm("Attendance", "Home", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl, @class = "form-horizontal", role = "form" })) { 
@Html.TextBoxFor(m => m.Speaker, new { @class = "form-control", placeholder = "Speaker", type = "text", required = "required " })
@foreach (var item in Model.MemberAttendance) { }
Name Surname
@Html.CheckBox("Attendant") @item.Name @item.Surname
}

Você tem que usar para em vez de foreach e usar oculto para. Eu testei o seguinte e funciona perfeitamente

  @model ServiceAttendance @{ ViewBag.Title = "Attendance"; } 

Attendance

@using (Html.BeginForm()) {
@Html.TextBoxFor(modelItem => modelItem.Speaker)
@for (int i=0;i }
Name Surname
@Html.CheckBoxFor(it=>Model.MemberAttendance[i].Attendant) @Html.HiddenFor(it => Model.MemberAttendance[i].Attendant) @Model.MemberAttendance[i].Name @Html.HiddenFor(it => Model.MemberAttendance[i].Name) @Model.MemberAttendance[i].Surname @Html.HiddenFor(it=>Model.MemberAttendance[i].Surname)
}

Então o que você tem que fazer é replace o foreach com o seguinte

  @for (int i=0;i @Html.CheckBoxFor(it=>Model.MemberAttendance[i].Attendant) @Html.HiddenFor(it => Model.MemberAttendance[i].Attendant)  @Model.MemberAttendance[i].Name @Html.HiddenFor(it => Model.MemberAttendance[i].Name) @Model.MemberAttendance[i].Surname @Html.HiddenFor(it=>Model.MemberAttendance[i].Surname)  } 

Confira o BeginCollectionItem html helper disponível no nuget ou aqui: https://github.com/danludwig/BeginCollectionItem

Você pode ver mais informações sobre o comportamento neste blog: http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection. aspx

O fichário de modelo padrão está esperando os nomes para vir neste formulário:

 MemberAttendance[0].Prop = "prop" MemberAttendance[0].BoolProp = false 

então você precisa nomear as inputs da mesma forma:

        

Você não produziu nenhuma parte do MemberAttendance para postar de volta. Você acabou de produzir seu conteúdo.

Mudanças mínimas no seu código seriam mudar o foreach :

 @for (int i=0; i m.MemberAttendance[i].MemberID); @Html.HiddenFor(m => m.MemberAttendance[i].Name); @Html.HiddenFor(m => m.MemberAttendance[i].Surname); @Html.HiddenFor(m => m.MemberAttendance[i].Attendant); } 

Se é isso que você realmente quer fazer.