Показать выбранные элементы в списке с множественным выбором

Я пробовал разные способы заставить это работать. Думаю может у меня чего-то не хватает в моей модели или контроллере, поэтому выкладываю все три части.

У меня есть данные в базе данных, которые показывают некоторые темы для консультирования, выбранные консультантом на предыдущей встрече. Когда консультант вызывает эту встречу, приложение должно отобразить список всех возможных тем с выделенными ранее выбранными. Все работает, кроме последнего пункта.

Я знаю, что получаю правильную информацию, потому что могу отображать выбранные элементы по отдельности. Я просто не могу заставить их отображаться выбранными. Вот код. Я вырезаю ненужные части.

public class AppointmentModel
{ ...
    public string AdvisingTopicId { get; set; }
    public List<SelectListItem> AdvisingIdList { get; set; }
    public SelectList AdvisingTopicNames { get; set; }
}

public class HomeController : AdvisorBaseController
{ ...
        var topicCodes = appointment.advising_topic.ToList();

        var advisingTopics = new SelectList((from t in topicCodes
                              select t.name).ToList(), "name");

        var topicsList = (from t in db.advising_topic
                          select new SelectListItem
                          {
                              Selected = false,
                              Text = t.name,
                              Value = SqlFunctions.StringConvert((double)t.advising_topic_id).Trim()
                          }).ToList();

        foreach (var topicCode in topicCodes)
        {
            var selTopic = topicsList.Find(x => x.Value == topicCode.advising_topic_id.ToString());
            if (selTopic != null)
            {
                selTopic.Selected = true;
            }
        } ...
            var appointmentModel = new AppointmentModel
            { ...
                AdvisingTopicNames = advisingTopics,
                AdvisingIdList = topicsList,
            };

а потом вид

@model AcademicAdvising.Models.AppointmentModel
<h3>Advising Topics</h3>
<ul>
    @foreach (var item in Model.AdvisingTopicNames)
    {
        <li>@Html.DisplayFor(x => item)</li>
    }
</ul>
    @Html.ListBoxFor(m=>m.AdvisingIdList, new SelectList(Model.AdvisingTopicNames, "Value", "Text", Model.AdvisingTopicNames.SelectedValue))

Обратите внимание, что foreach правильно отображает выбранные элементы. Вот только для пробы и будет вытаскиваться. ListBoxFor - это то, где я борюсь. То, что у меня здесь, не работает (показывает полный список, ничего не выделено). И это тот момент, когда я пробовал разные подходы, и все они терпели неудачу.


person user2283231    schedule 01.05.2013    source источник
comment
Предложение Брайана Робертса работает. То есть @Html.ListBox(myLB, Model.AdvisingIdList) возвращает выделенный список. Поэтому я собираюсь отметить это как «Отвечено» и уйти и попытаться выяснить, почему это не работает с ListBoxFor.   -  person user2283231    schedule 03.05.2013
comment
Иногда могут быть проблемы с именами. Посмотрите на имена, которые вы определяете, и убедитесь, что вы не используете их повторно. Обратите внимание на параметры строки запроса и элементы, которые помещаются в область просмотра.   -  person Bryan Roberts    schedule 03.05.2013


Ответы (1)


Похоже, вы случайно зашли слишком глубоко. У вас уже есть список выбора, который является всем, что нужно функции listboxfor.

 @Html.ListBoxFor(m=>m.AdvisingIdList, Model.AdvisingTopicNames)

Но, честно говоря, глядя на то, как вы определяете свои списки, я думаю, что вы действительно хотите

 @Html.ListBoxFor(m=>m.AdvisingIdList, Model.AdvisingIdList)
person Bryan Roberts    schedule 01.05.2013
comment
Ни один из них не работал. В первом случае отображаются только выбранные темы (ничего не выделено). В последнем случае отображаются все темы, но ничего не выделено. Но спасибо за быстрый ответ. - person user2283231; 02.05.2013
comment
Это похоже на проблему с данными. Второй показывает полный список, но то, что происходит, звучит так, как будто вы ничего не устанавливаете для «выбранного», проверьте свою строку кода if (selTopic!= null) { selTopic.Selected = true; } И убедитесь, что if действительно происходит попадание, и что-то запускает флаг selected в true. - person Bryan Roberts; 02.05.2013
comment
Я думал, что проверил это, но я посмотрю еще раз, потому что ваша мысль очень похожа на мою - просто мне показалось, что проблема с данными, а не с презентацией. Если я смогу исправить это, я вернусь, чтобы отметить решение. - person user2283231; 02.05.2013
comment
Ну, скрипи. Судя по контроллеру, это определенно так. Список тем содержит все темы, и отладка показывает, что для некоторых установлено значение Selected=True, а для других установлено значение False. Они даже правильные! :) Это означает, что поле AdvisingIdList содержит все 22 темы, причем для некоторых из них выбрано значение True. Это именно то, что я хочу. Теперь, кажется, я вернулся к проблеме с презентацией! - person user2283231; 02.05.2013
comment
И вы сейчас используете @Html.ListBoxFor(m=›m.AdvisingIdList, Model.AdvisingIdList), верно? - person Bryan Roberts; 02.05.2013
comment
@Html.ListBoxFor(m=›m.AdvisingIdList, Model.AdvisingIdList) Правильно. Я просто перезапустил его из Visual Studio. Тот же результат: я получаю все темы, ни одна из которых не выделена, чтобы показать, что они были выбраны ранее. - person user2283231; 02.05.2013
comment
У меня есть базовый пример этой работы. Это может быть какая-то проблема с вещами, которые называются одинаково. Попробуйте просто использовать обычный список @Html.ListBox(myLB, Model.AdvisingIdList) - person Bryan Roberts; 02.05.2013