У меня есть следующий код, по моему мнению:
<%= 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 на Проект. Категории (соответствие моей модели) и этому теперь НЕ УДАЕТСЯ выбрать объект.
<%= Html.ListBox("Project.Categories",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
Я, очевидно, не понимаю волшебства, которое происходит здесь.
Хорошо, это просто называет, например, это работает...
<%= Html.ListBox("Project_Tags",
new MultiSelectList(Model.Tags, "Id", "Name", Model.Project.Tags.Select(t => t.Id)))%>
... потому что имя поля является Project_Tags, не Проектом. Теги, на самом деле, что-либо кроме Тегов или Проекта. Теги будут работать. Я не добираюсь, почему это вызвало бы проблему (кроме которого она соответствует имени объекта), и я не достаточно хорош в этом, чтобы смочь закопать и узнать.
Хотя это не ответ на ваш главный вопрос, Стоит отметить, что когда MVC генерирует имена, он превращает что-то вроде Project.Tags в Project_Tags, заменяя точки подчеркиванием.
Причина, по которой это происходит, заключается в том, что точка в идентификаторе элемента будет выглядеть как элемент с именем Project с классом тегов для CSS. Очевидно, что это плохо, поэтому для сохранения предсказуемости поведения используется подчеркивание.
В вашем первом примере
<%= Html.ListBoxFor(c => c.Project.Categories,
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
список пытается привязаться к Model.Project.Categories для вашей строго типизированной модели, которая была предоставлена странице (с использованием лямбда-нотации). Я не уверен, что делает второй параметр в ListBoxFor.
Какая модель передается на страницу?
Попробовать
<%= Html.ListBoxFor(c => c.Project.Categories,
new MultiSelectList(
Model.Categories
,"Id"
,"Name"
,Model.Project.Tags.Select(
x => new SelectListItem()
{
Selected = true,
Text = x.TEXT,
Value = x.ID.ToString()
}).ToList())
)
)%>
Я тоже столкнулся с той же проблемой и столкнулся с той же проблемой с ListBox и ListBoxFor.
Независимо от того, что я делаю, я не могу выполнить выбор в ListBoxFor. Если я перейду на ListBox и назову его как-нибудь ДРУГОЕ, чем имя свойства данных, к которым я привязываюсь, произойдет выбор.
Но тогда, поскольку я не использую ListBoxFor, а данные находятся, например, внутри класса модели (Model.Departments), я не получаю привязку модели на обратном пути к моему контроллеру, и, следовательно, свойство имеет значение null.
ИЗМЕНИТЬ Я нашел решение, опубликованное здесь кем-то другим; Проблемы с выбором значений в ListBoxFor