Недавно работая над моим первым веб-приложением ASP.Net MVC2, я столкнулся с некоторыми проблемами, когда мне нужно было выбрать несколько значений в списке. Я работал над этим с помощью некоторого jQuery, но продолжил и собрал очень простой код для демонстрации. Я использую EF для модели с двумя объектами - Customers и HelpDeskCalls:
Контроллер:
public ActionResult Edit(int id)
{
Customer currCustomer = ctx.Customers.Include("HelpDeskCalls").Where(c => c.ID == id).FirstOrDefault();
List<HelpDeskCall> currCustCalls = (ctx.HelpDeskCalls.Where(h => h.CustomerID == id)).ToList();
List<SelectListItem> currSelectItems = new List<SelectListItem>();
List<String> selectedValues = new List<string>();
foreach (HelpDeskCall currCall in currCustCalls)
{
bool isSelected = (currCall.ID % 2 == 0) ? true : false;
//Just select the IDs which are even numbers...
currSelectItems.Add(new SelectListItem() { Selected = isSelected, Text = currCall.CallTitle, Value = currCall.ID.ToString() });
//add the selected values into a separate list as well...
if (isSelected)
{
selectedValues.Add(currCall.ID.ToString());
}
}
ViewData["currCalls"] = (IEnumerable<SelectListItem>) currSelectItems;
ViewData["currSelected"] = (IEnumerable<String>) selectedValues;
return View("Edit", currCustomer);
}
Вид:
<div class="editor-field">
<%: Html.ListBoxFor(model => model.HelpDeskCalls, new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable) ViewData["currSelected"]), new { size = "12" })%>
<%: Html.ListBoxFor(model => model.HelpDeskCalls, ViewData["currCalls"] as IEnumerable<SelectListItem>, new { size = "12"}) %>
<%: Html.ListBox("Model.HelpDeskCalls", new MultiSelectList(Model.HelpDeskCalls, "ID", "CallTitle", (IEnumerable)ViewData["currSelected"]), new { size = "12"}) %>
<%: Html.ValidationMessageFor(model => model.HelpDeskCalls) %>
</div>
Для этого примера я просто выбираю HelpDeskCall.ID, которые являются четными. Я пытаюсь два разных синтаксиса для ListBoxFor: один использует IEnumerable значений для выбора, другой использует IEnumerable из SelectListItems. По умолчанию, когда я запускаю этот код, выбор ListBoxFor не выполняется, но ListBox не строго типизирован и выбирается правильно.
Я прочитал этот пост на ASP.Net и этот пост на SO, но не радость. Фактически, если я добавлю переопределение ToString () в мой класс HelpDeskCall (как предложено в потоке ASP.net), все значения будут выбраны, что тоже неправильно.
Если бы кто-то мог пролить некоторый свет на то, как это должно работать (и что я пропускаю или делаю неправильно), тогда неофит был бы очень благодарен.