Числовой DropDownListFor с Entity Framework — выбранный элемент не установлен

Среда: Entity Framework (v6.0) с MVC и Razor. Бэкэнд — это SQL Server.

Помощник HTML DropDownListFor() отлично работает для столбца string в базе данных. Однако, когда я использую столбец десятичный с числовым выпадающим списком, платформа не выбирает значение, загруженное из базы данных при отображении формы.

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

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

Любая помощь принята с благодарностью. Спасибо.

Код просмотра: проблемное поле — CollarSize. Выпадающий список CollarSizeSelect.

<div class="form-group">
     @Html.LabelFor(model => model.CollarSize, htmlAttributes: new { @class = "control-label col-md-2" })
     <div class="col-md-10">
            @Html.DropDownListFor(model => model.CollarSize, Model.CollarSizeSelect, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CollarSize, "", new { @class = "text-danger" })
     </div>
</div>

Определение класса содержит столбец, определенный следующим образом:

public Nullable<decimal> CollarSize { get; set; }

Выпадающий список CollarSize построен следующим образом:

public IEnumerable<SelectListItem> ChestSizeSelect
{
    get
    {
        return GetSelectNumberRange(32, 60, (decimal)1.0);
    }
}

private static List<SelectListItem> GetSelectNumberRange(int start, int end, decimal increment)
{
    List<SelectListItem> numlist = new List<SelectListItem>();
    for (decimal i = start; i <= end; i = i + increment)
    {
       numlist.Add(new SelectListItem() {Text = i.ToString(), Value = i.ToString()});
    }
    return numlist;
}

person S Jones    schedule 03.08.2015    source источник
comment
В html нет такой вещи, как decimal. Если значение CollarSize точно совпадает со значением одного из ваших вариантов (т. е. с использованием ToString()), то этот параметр будет отображаться.   -  person    schedule 03.08.2015
comment
Спасибо. Я пробовал это, но получил InvalidOperationException. Шаблоны можно использовать только с доступом к полям, доступом к свойствам, индексом одномерного массива или пользовательскими выражениями индексатора с одним параметром. Я пробовал: @Html.DropDownListFor(model => model.CollarSize.ToString(),   -  person S Jones    schedule 03.08.2015
comment
Нет, я не хочу этого делать! Каково значение CollarSize. Если это (скажем) 42 и у вас есть вариант с value="42", то он будет выбран. Соответствует ли значение CollarSize точно значению одного из ваших вариантов?   -  person    schedule 03.08.2015
comment
Да, есть совпадение, например. CollarSize = 15.0, CollarSizeSelect имеет запись для 15.0 (строка).   -  person S Jones    schedule 03.08.2015
comment
У меня работает нормально — обратитесь к этому DotNetFiddle. Я подозреваю, что CollarSize.ToString() не возвращается "15.0"   -  person    schedule 03.08.2015
comment
Стивен, большое спасибо, что нашли время, чтобы настроить тест, показывающий, как это должно работать. Будучи новичком в MVC, это было для меня поучительно. Однако на самом деле проблема была связана со схемой базы данных. Я обнаружил это, потому что, когда я установил раскрывающийся список выбора на 2 знака после запятой, он работал, то есть 15.00M работал, а 15.0M — нет. Схема db определила столбец как десятичный (5,2), и Entity Framework применил это (я использовал схему MVC First для создания класса модели из db). Ваш пример был идеальным, но проблема была не в образце кода, который я предоставил, так что вы не могли его увидеть.   -  person S Jones    schedule 04.08.2015


Ответы (1)


Проблема заключалась не в построении SelectList, а в базовой схеме базы данных.

Столбец базы данных:

CollarSize decimal(5, 2) NULL,

Я использовал Entity Framework для построения модели из базы данных (опция мастера «Конструктор EF из базы данных»). EF сгенерировал поле в сгенерированной модели:

public Nullable<decimal> CollarSize { get; set; }

Список SelectList, который я создал для заполнения DropDownListFor(), содержал список десятичных элементов, но эти элементы имели точность до одного десятичного знака, т. е. 15,0M. Однако EF сохранил исходную точность, поэтому при заполнении DropDownList элемент Selected не мог быть найден, так как он сравнивал 15,0 с 15,00.

Мое решение состояло в том, чтобы построить SelectList с явной точностью:

public IEnumerable<SelectListItem> CollarSizeSelect
{
    get
    {
         return new SelectList(new List<decimal> { 14.00M, 14.50M, 15.00M, 15.50M...
    }
}
person S Jones    schedule 04.08.2015