How do I render a group of checkboxes using MVC 4 and View Models (strongly typed)
asp.net, asp.net-mvc, asp.net-mvc-4, razor
Solution
You could enrich your view model:
public class VendorAssistanceViewModel
{
public string Name { get; set; }
public bool Checked { get; set; }
}
public class ContactViewModel
{
public ContactViewModel()
{
VendorAssistances = new[]
{
new VendorAssistanceViewModel { Name = "DJ/BAND" },
new VendorAssistanceViewModel { Name = "Officiant" },
new VendorAssistanceViewModel { Name = "Florist" },
new VendorAssistanceViewModel { Name = "Photographer" },
new VendorAssistanceViewModel { Name = "Videographer" },
new VendorAssistanceViewModel { Name = "Transportation" },
}.ToList();
}
[Required]
public string Name { get; set; }
[Required]
public string Phone { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
public string Subject { get; set; }
public IEnumerable<SelectListItem> SubjectValues
{
get
{
return new[]
{
new SelectListItem { Value = "General Inquiry", Text = "General Inquiry" },
new SelectListItem { Value = "Full Wedding Package", Text = "Full Wedding Package" },
new SelectListItem { Value = "Day of Wedding", Text = "Day of Wedding" },
new SelectListItem { Value = "Hourly Consultation", Text = "Hourly Consultation" }
};
}
}
public IList<VendorAssistanceViewModel> VendorAssistances { get; set; }
}
Controller:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new ContactViewModel());
}
[HttpPost]
public ActionResult Index(ContactViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
//Send email logic
return RedirectToAction("ContactConfirm");
}
}
View:
@using (Html.BeginForm())
{
<div id="ContactContainer">
<div><span class="RequiredField">* </span>Your Name:</div>
<div>
@Html.TextBoxFor(model => model.Name)
</div>
<div><span class="RequiredField">* </span>Your Phone:</div>
<div>
@Html.TextBoxFor(model => model.Phone)
</div>
<div><span class="RequiredField">* </span>Your Email:</div>
<div>
@Html.TextBoxFor(model => model.Email)
</div>
<div>Subject:</div>
<div>
@Html.DropDownListFor(model => model.Subject, Model.SubjectValues)
</div>
<div>Vendor Assistance:</div>
<div>
@for (int i = 0; i < Model.VendorAssistances.Count; i++)
{
<div>
@Html.HiddenFor(x => x.VendorAssistances[i].Name)
@Html.CheckBoxFor(x => x.VendorAssistances[i].Checked)
@Html.LabelFor(x => x.VendorAssistances[i].Checked, Model.VendorAssistances[i].Name)
</div>
}
</div>
<div>
<input id="btnSubmit" type="submit" value="Submit" />
</div>
</div>
}
Problem
I'm rather new to the ASP.net MVC world and I'm trying to figure out how to render a group of checkboxes that are strongly typed to a view model. In webforms I would just use the checkboxlist control but im a bit lost with MVC. I'm building a simple contact form for a wedding planning business and need to pass whatever checkbox values the user selects to my controller. The form checkboxes need to look like this: Your help would be greatly appreciated. Thanks! Here's what I have so far. CONTROLLER ``` [HttpPost] public ActionResult Contact(ContactViewModel ContactVM) { if (!ModelState.IsValid) { return View(ContactVM); } else { //Send email logic return RedirectToAction("ContactConfirm"); } } ``` VIEW MODEL ``` public class ContactViewModel { [Required] public string Name { get; set; } [Required] public string Phone { get; set; } [Required] [DataType(DataType.EmailAddress)] public string Email { get; set; } [Required] public string Subject { get; set; } public IEnumerable<SelectListItem> SubjectValues { get { return new[] { new SelectListItem { Value = "General Inquiry", Text = "General Inquiry" }, new SelectListItem { Value = "Full Wedding Package", Text = "Full Wedding Package" }, new SelectListItem { Value = "Day of Wedding", Text = "Day of Wedding" }, new SelectListItem { Value = "Hourly Consultation", Text = "Hourly Consultation" } }; } } //Not sure what I should do for checkboxes... } ``` VIEW ``` @model NBP.ViewModels.ContactViewModel @{ ViewBag.Title = "Contact"; Layout = "~/Views/Shared/_Layout.cshtml"; } @using (Html.BeginForm()) { <div id="ContactContainer"> <div><span class="RequiredField">* </span>Your Name:</div> <div> @Html.TextBoxFor(model => model.Name) </div> <div><span class="RequiredField">* </span>Your Phone:</div> <div> @Html.TextBoxFor(model => model.Phone) </div> <div><span class="RequiredField">* </span>Your Email:</div> <div> @Html.TextBoxFor(model => model.Email) </div> <div>Subject:</div> <div> @Html.DropDownListFor(model => model.Subject, Model.SubjectValues) </div> <div>Vendor Assistance:</div> <div> <!-- CHECKBOXES HERE --> </div> <div> <input id="btnSubmit" type="submit" value="Submit" /> </div> </div> } ```