Как и в сторону, вы не сможете получить вашу модель обратно с кодом вы показали. Методы вспомогательного использования ListBoxFor
(и DropDownListFor
) используют это IEnumerable<SelectListItem>
, чтобы фактически отобразить их содержимое, и вы передаете пустую коллекцию SelectListItems
в метод. Вы можете использовать эти методы расширения чтобы создать IEnumerable<SelectListItem>
из любого IEnumerable<string>
:
public static class IEnumerableStringExtensions
{
public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items)
{
return IEnumerableStringExtensions.ToSelectListItemList(items, new List<string>());
}
public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items, string selectedValue)
{
return IEnumerableStringExtensions.ToSelectListItemList(items, new List<string>());
}
public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items, IEnumerable<string> selectedValues)
{
List<SelectListItem> listitems = new List<SelectListItem>(items.Count());
foreach (string s in items)
{
listitems.Add(new SelectListItem()
{
Text = s,
Value = s,
Selected = selectedValues.Contains(s)
});
}
return listitems;
}
}
Используйте методы, как это:
<%:Html.ListBoxFor(m => m.PermissionList, Model.PermissionList.ToSelectListItemList(), new { size = 10 })%>
Используя образец проекта, я не был в состоянии дублировать исключение из кода, (PermissionList
было всего лишь null), но, по крайней мере, класс выше вернет вашу модель обратно на сервер (точнее значения, выбранные пользователем из списка).