使用MVC Razor传递列表对象

我正在使用一个对象但在对象内部我有一个属性是一个对象列表。 我希望将该对象与其中的列表对象一起传递,但是当我提交表单时列表为空。 我不知道如何处理这个问题。

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
}

您必须使用而不是foreach并使用Hidden for。 我测试了以下内容并且完美无缺

  @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)
}

所以你要做的就是用以下内容替换foreach

  @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)  } 

查看nuget或此处提供的BeginCollectionItem html帮助程序: https : //github.com/danludwig/BeginCollectionItem

您可以在此博客上查看有关此行为的更多信息: http : //weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection。 ASPX

默认的模型绑定器期望名称以这种forms出现:

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

所以你需要类似地命名输入:

        

您没有输出MemberAttendance任何部分以进行回发。 你只需输出它的内容。

对代码的最小更改将是更改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); } 

如果那是你真正想做的事情。