ASP.NET MVC (бритва) список выбора множественных значений в строку - PullRequest
2 голосов
/ 04 января 2012

У меня есть два списка с несколькими вариантами выбора;один с месяцами и один с годами, например:

@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeMonths, Model.TimeframeMonths)
@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeYears, Model.TimeframeYears)

Я сохраняю оба значения в базе данных в виде списка через запятую (строка / nvarchar).Значения выглядят так: Месяцы: 1,3,7; Годы: 2002,2005

По какой-то причине, когда я возвращаю значения обратно в форму, месяцы предварительно выбираются в списке в порядке, а годы - нет.

Есть идеи?


РЕДАКТИРОВАТЬ - Дополнительные примеры кода:

Контроллер - Управление

public ActionResult Manage(Guid id)
    {
        var list = _listService.GetList(id);

        var model = LoadModelFromObject(list);
        model.TimeframeMonths = GenerateMonthDropdown();
        model.TimeframeYears = GenerateYearDropdown(model.IncludeGuestsArrivedInTimeframeYears.Split(','));
        model.DaysOfWeek = GenerateDaysOfWeekDropdown();

        return View(model);
    }

Контроллер - «Помощник»

private IList<SelectListItem> GenerateYearDropdown(string[] selected)
    {
        var list = new List<SelectListItem>();

        var startYear = DateTime.Now.Year - 10;

        for (int idx = startYear; idx < startYear + 11; idx++)
        {
            list.Add(new SelectListItem
                         {
                             Value = idx.ToString(),
                             Text = idx.ToString(),
                             Selected = selected != null && selected.Contains(idx.ToString())
                         });
        }

        return list;
    }

Вид

@Html.CheckBoxFor(m => m.IncludeGuestsArrivedInTimeframe)
@Html.LabelFor(m => m.IncludeGuestsArrivedInTimeframe)
@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeMonths, Model.TimeframeMonths)
@*@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeYears, Model.TimeframeYears)*@
@Html.ListBox("IncludeGuestsArrivedInTimeframeYears", Model.TimeframeYears)

Ответы [ 3 ]

4 голосов
/ 04 января 2012

Необходимо установить для свойства Selected класса SelectItemList значение true для параметров, которые необходимо предварительно выбрать.

Пример:

@{
    var foo = new List<SelectListItem> { 
        new SelectListItem { Text = "Foo 1", Value = "1", Selected = true },
        new SelectListItem { Text = "Foo 2", Value = "2" },
        new SelectListItem { Text = "Foo 3", Value = "3", Selected = true }
    };
}

@Html.ListBox("foo", foo)

В этом случае Foo 1 и Foo 3 должны отображаться как предварительно выбранные. Приведенный выше код генерирует следующую HTML-разметку:

<select id="foo" multiple="multiple" name="foo">
    <option selected="selected" value="1">Foo 1</option>
    <option value="2">Foo 2</option>
    <option selected="selected" value="3">Foo 3</option>
</select>

Edit:

Прежде всего, замените этот код:

list.Add(new SelectListItem {
     Value = idx.ToString(),
     Text = idx.ToString(),
     Selected = selected != null && selected.Contains(idx.ToString())
});

с этим кодом:

list.Add(new SelectListItem {
     Value = idx.ToString(),
     Text = idx.ToString(),
     Selected = true
});

Затем запустите приложение. Если все варианты предварительно выбраны, то держу пари, что selected != null && selected.Contains(idx.ToString()) не удовлетворяет условию.

1 голос
/ 01 июля 2014

Еще один способ сделать это

@Html.ListBox("categoryId", new MultiSelectList(ViewData["categories"] as System.Collections.IEnumerable, "Id", "CategoryName", Model.tIdx_ProductCategories.Select(x => x.CategoryId).AsEnumerable()))

Пояснение:

  1. categoryId - будет именем элемента управления при отображении в формате html
  2. ViewData["categories"] - это список категорий с Id и CategoryName свойствами
  3. Model.tIdx_ProductCategories содержит список идентификаторов категорий, которые должны быть выбраны в списке.
0 голосов
/ 23 декабря 2013

Как кажется (например, здесь Предварительный выбор элементов в Multiselect-Listbox (MVC3 Razor) ), механизм Razor счастливо игнорирует свойство Selected и сравнивает список из модели и предоставленногосписок опций путем вызова ToString () для объектов из модели и использования сравнения строк для выбора.

Что я не могу объяснить себе, так это почему это поведение используется с Html.ListBox (), которая не использует какую-либо модель и ожидает коллекцию SelectListItem.

Думаю, что это ошибка, но, похоже, она не была недавно устранена.

...