У меня есть следующий код на мой взгляд:
<%= Html.ListBoxFor(c => c.Project.Categories,
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
<%= Html.ListBox("MultiSelectList",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
Единственное отличие состоит в том, что первый помощник имеет строгую типизацию (ListBoxFor), а не отображает выбранные элементы (1,2), даже если элементы отображаются в списке и т. Д. Более простой ListBox работает как положено.
Я явно что-то здесь упускаю. Я могу использовать второй подход, но это действительно беспокоит меня, и я хотел бы выяснить это.
Для справки, моя модель:
public class ProjectEditModel
{
public Project Project { get; set; }
public IEnumerable<Project> Projects { get; set; }
public IEnumerable<Client> Clients { get; set; }
public IEnumerable<Category> Categories { get; set; }
public IEnumerable<Tag> Tags { get; set; }
public ProjectSlide SelectedSlide { get; set; }
}
Обновление
Я просто изменил имя ListBox на Project.Categories (соответствует моей модели), и теперь он не может выбрать элемент.
<%= Html.ListBox("Project.Categories",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
Я явно не понимаю магию, которая здесь происходит.
Обновление 2
Хорошо, это чисто именование, например, это работает ...
<%= Html.ListBox("Project_Tags",
new MultiSelectList(Model.Tags, "Id", "Name", Model.Project.Tags.Select(t => t.Id)))%>
... потому что имя поля Project_Tags, а не Project.Tags, на самом деле, будет работать что угодно, кроме тегов или Project.Tags. Я не понимаю, почему это может вызвать проблемы (кроме того, что это соответствует имени сущности), и я не достаточно хорош в этом, чтобы копаться и узнавать.