我有一个包含几个列表的模型:
[Display(Name = "Facilities")]
public List<facility> Facilities { get; set; }
[Display(Name = "Accreditations")]
public List<accreditation> Accreditations { get; set; }
我最初从我的控制器填充这些列表:
public ActionResult Register()
{
var viewModel = new RegisterModel();
viewModel.Facilities = m_DBModel.facilities.ToList();
viewModel.Accreditations = m_DBModel.accreditations.ToList();
return View(viewModel);
}
当他们到达我的视图时,他们会填充数据库记录(很棒)。然后我将模型传递给局部视图,该视图将这些列表显示为复选框,为用户操作做好准备(我已尝试使用for循环而不是foreach循环的另一个建议,没有区别):
@model LanguageSchoolsUK.Models.RegisterModel
@foreach (var item in Model.Facilities)
{
@Html.Label(item.name);
@Html.CheckBox(item.name, false, new { id = item.facility_id, @class = "RightSpacing", @description = item.description })
}
当我提交表单时,它最终回到我的控制器,这次调用控制器上的重载寄存器功能:
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Do stuff
}
return View(model);
}
问题是包含列表(设施和认证)的模型参数告诉我列表为空。
请有人告诉我我做错了什么,为什么他们不会填充我最初通过的收藏品,并希望有一种方式可以检查那些已经检查过的那些?
感谢。
答案 0 :(得分:1)
我试过基于另一个建议使用for循环而不是 foreach循环,没有区别
再试一次,我相信这次你会有更多的运气。哦,并使用强类型助手:
@model LanguageSchoolsUK.Models.RegisterModel
@for (var i = 0; i < Model.Facilities.Count; i++)
{
@Html.HiddenFor(x => x.Facilities[i].name)
@Html.LabelFor(x => x.Facilities[i].IsChecked, Model.Facilities[i].name);
@Html.CheckBoxFor(
x => x.Facilities[i].IsChecked,
new {
id = item.facility_id,
@class = "RightSpacing",
description = item.description // <!-- HUH, description attribute????
}
)
}
另外,你的答案无疑会注意到复选框可以在模型上使用布尔字段,而不是整数,而不是小数,而不是字符串=&gt;布尔。
因此,请确保模型上有一个布尔字段,该字段将保持复选框的状态。在我的例子中,这个字段被称为IsChecked
,但显然你可以完全自由地发现它是一个更好的名字。