Почему ListBoxFor не выбирает объекты, но ListBox?

У меня есть следующий код, по моему мнению:

<%= 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 }))%>

Я, очевидно, не понимаю волшебства, которое происходит здесь.

Обновление 2

Хорошо, это просто называет, например, это работает...

<%= Html.ListBox("Project_Tags",
new MultiSelectList(Model.Tags, "Id", "Name", Model.Project.Tags.Select(t => t.Id)))%>

... потому что имя поля является Project_Tags, не Проектом. Теги, на самом деле, что-либо кроме Тегов или Проекта. Теги будут работать. Я не добираюсь, почему это вызвало бы проблему (кроме которого она соответствует имени объекта), и я не достаточно хорош в этом, чтобы смочь закопать и узнать.

30
задан Jason Berkan 13 July 2010 в 14:11
поделиться

3 ответа

Хотя это не ответ на ваш главный вопрос, Стоит отметить, что когда 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.

Какая модель передается на страницу?

1
ответ дан 28 November 2019 в 00:16
поделиться

Попробовать

<%= 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())

       )
)%>
1
ответ дан 28 November 2019 в 00:16
поделиться

Я тоже столкнулся с той же проблемой и столкнулся с той же проблемой с ListBox и ListBoxFor.

Независимо от того, что я делаю, я не могу выполнить выбор в ListBoxFor. Если я перейду на ListBox и назову его как-нибудь ДРУГОЕ, чем имя свойства данных, к которым я привязываюсь, произойдет выбор.

Но тогда, поскольку я не использую ListBoxFor, а данные находятся, например, внутри класса модели (Model.Departments), я не получаю привязку модели на обратном пути к моему контроллеру, и, следовательно, свойство имеет значение null.

ИЗМЕНИТЬ Я нашел решение, опубликованное здесь кем-то другим; Проблемы с выбором значений в ListBoxFor

3
ответ дан 28 November 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: