从List 创建MVC3 CheckBoxFor并在Post上获取列表(使用更新的值)

我在ViewModel中有一个List,我解析为View

List 

BoolSetting:

  public class BoolSetting { public BoolSetting(string displayName, bool value) { DisplayName = displayName; Value = value; } public string DisplayName { get; set; } public bool Value { get; set; } } 

然后,我想打印列表中所有项目的复选框,因此列表位于视图使用的ViewModel中

 @foreach(var boolSettingList in Model.BoolSettingList) { 
@Html.CheckBox(boolSettingList.DisplayName, boolSettingList.Value) @boolSettingList.DisplayName
}

问题是当我发布这个,然后我的模型没有在我的ViewModel中的List中保存更新的设置(bool值),因此该对象为空。

我可以

 foreach (var VARIABLE in userSettingConfigViewModel.BoolSettingList) { VARIABLE.Value = (bool)Request.Form[VARIABLE.DisplayName]; } 

但是这个视图模型将有许多列表,其中一些将具有相同的名称! 这样会引起冲突

那么有没有办法预先打印所有我的bool然后让MVC弄清楚将数据放回到List对象之后? 我不能让CheckBoxFor工作,因为它想要一个表达式,我无法找到一种方法来通过我的列表迭代

我可以通过为BoolSetting制作模板并使用List来修复模板吗?

首先修复视图模型并删除自定义构造函数,否则默认模型绑定器将无法实例化它,您将不得不编写自定义模型绑定器和东西:

 public class BoolSetting { public string DisplayName { get; set; } public bool Value { get; set; } } public class MyViewModel { public List Settings { get; set; } } 

然后编写一个控制器动作来填充视图模型:

 public class HomeController : Controller { public ActionResult Index() { var model = new MyViewModel { Settings = new[] { new BoolSetting { DisplayName = "name 1", Value = true }, new BoolSetting { DisplayName = "name 2", Value = false }, new BoolSetting { DisplayName = "name 3", Value = true }, }.ToList() }; return View(model); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } } 

然后是一个视图( ~/Views/Home/Index.cshtml ),您只需使用编辑器模板,不要编写任何foreach循环或弱类型的html帮助程序,如Html.CheckBox 。 通过使用编辑器模板,您将确保所有输入字段都具有正确的名称,以便默认模型绑定器能够在回发期间将其值提取到视图模型中:

 @model MyViewModel @using (Html.BeginForm()) { @Html.EditorFor(x => x.Settings)  } 

最后是视图模型的相应编辑器模板,它将为集合的每个元素呈现( ~/Views/Home/EditorTemplates/BoolSetting.cshtml ):

 @model BoolSetting 
@Html.CheckBoxFor(x => x.Value) @Html.LabelFor(x => x.Value, Model.DisplayName) @Html.HiddenFor(x => x.DisplayName)