单击提交按钮mvc 3后如何填充具有List 属性的ViewModel?

我想使用viewModel制作一周中的一天复选框。 View上的一切正常,但是,如果我单击“提交”以保存更改, weeklySchedule我的weeklySchedule方法中的weeklySchedule为null。

为什么weeklySchedule null? 如何将选定的复选框值发送到我的HttPost操作? 任何建议都会有帮助。

在此处输入图像描述

模型:

 public class Settings { public class WeeklySetting { public string DisplayName { get; set; } public string Value { get; set; } public bool IsChecked { get; set; } } } 

查看型号:

 public class ViewModels { public class Weekly { public List<Settings.WeeklySetting> Settings { get; set; } } } public ActionResult CreateWeekly() { var model = new ViewModels.Weekly { Settings = new[] { new Settings.WeeklySetting{ DisplayName="Monday", Value="MON", IsChecked=false}, new Settings.WeeklySetting{ DisplayName="Tuesday", Value="TUE", IsChecked=false}, new Settings.WeeklySetting{ DisplayName="Wednesday", Value="WED", IsChecked=false}, new Settings.WeeklySetting{ DisplayName="Thursday", Value="THU", IsChecked=false}, new Settings.WeeklySetting{ DisplayName="Friday", Value="FRI", IsChecked=false}, new Settings.WeeklySetting{ DisplayName="Saturday", Value="SAT", IsChecked=false}, new Settings.WeeklySetting{ DisplayName="Sunday", Value="SUN", IsChecked=false}, }.ToList() }; return View(model); } [HttpPost] public ActionResult CreateWeekly(string submitButton, ViewModels.Weekly weeklySchedule) { //Do something return View("CreateWeekly", weeklySchedule); } 

视图:

 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 

CreateWeekly

  <div> <%foreach (var item in Model.Settings) {%> <%:Html.CheckBoxFor(q=>item.IsChecked) %> <%:Html.LabelFor(q=>item.IsChecked,item.DisplayName) %> <%:Html.HiddenFor(q=>item.Value) %> <% } %> </div> <br /> <input value="GenerateForWeekly" name="submitButton" type="submit" /> <%} %> 

当您在视图中开始使用foreach(){}循环时,模型绑定不能很好地工作。 如果你使用EditorTemplate进行WeeklySetting,你会发现它工作得更好,因为它会为你排序所有索引。

例如(这是MVC3 Razor视图语法)

(1)为WeeklySetting创建一个编辑器模板:

 @model Settings.WeeklySetting @Html.CheckBoxFor(m => m.IsChecked) @Html.LabelFor(m => m.IsChecked,Model.DisplayName) @Html.HiddenFor(m => m.DisplayName) @Html.HiddenFor(m => m.Value) 

(2)使用EditorFor(无foreach)在视图中渲染:

 @using (Html.BeginForm()) { 
@Html.EditorFor(m => m.Settings)

}

如果你使用for循环而不是foreach它应该工作。 如下所示: http : //haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx