使用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 " }) Name Surname @foreach (var item in Model.MemberAttendance) { @Html.CheckBox("Attendant") @item.Name @item.Surname }
}
您必须使用而不是foreach并使用Hidden for。 我测试了以下内容并且完美无缺
@model ServiceAttendance @{ ViewBag.Title = "Attendance"; } Attendance
@using (Html.BeginForm()) { @Html.TextBoxFor(modelItem => modelItem.Speaker) Name Surname @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) }
}
所以你要做的就是用以下内容替换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); }
如果那是你真正想做的事情。