The Problem: I generate an @Html.ListBoxFor
based on a database query in my HttpGet. During my HttpPost, I want to validate that at least one element has been selected. If not, I just want to add a validation message.
The current result: I get the message "Please select at least one item" but now the Select is blank (The select element is there but contains 0 options). I understand that Model.Items
will be null in my HttpPost.
Question: How can I use my model to persist Model.Items
to make it not null?
Additional Information: I am trying to avoid using the FormCollection collection
and additional JavaScript.
--The code--
Controller:
public class HomeController : Controller
{
public ActionResult Index()
{
MyViewModel model = new MyViewModel
{
Items = Enumerable.Range(1, 5).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = "item " + x
})
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
Model:
public class MyViewModel
{
public MyViewModel()
{
Items = new List<SelectListItem>();
}
[Required(ErrorMessage = "Please select at least one item")]
public string[] SelectedItems { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
View:
@model ProjectGenerator.Models.MyViewModel
@using (Html.BeginForm())
{
@Html.ListBoxFor(x => x.SelectedItems, Model.Items)
@Html.ValidationMessageFor(x => x.SelectedItems)
<button type="submit">OK</button>
}