I want to make a day of the week checkbox using a viewModel. Everything is ok on the View, but, if I click submit to save changes, weeklySchedule within my httppost method is null.
Why is weeklySchedule null? How would I send the selected checkbox value to my HttPost action? Any advice would help.

Model:
public class Settings
{
public class WeeklySetting
{
public string DisplayName { get; set; }
public string Value { get; set; }
public bool IsChecked { get; set; }
}
}
View Model:
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);
}
View:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.Controllers.ViewModels.Weekly>" %><asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> CreateWeekly </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) { %>
<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" /> <%} %></asp:Content>
Model binding doesn’t work very nicely when you start using foreach() { } loops in your view. If you use an EditorTemplate for WeeklySetting you’ll find it works much better as it sorts out all the indices for you.
E.g. (this is MVC3 Razor view syntax)
(1) Create an editor template for WeeklySetting:
(2) Render in your view with an EditorFor (no foreach):