Ответ 1
Это имеет тенденцию сильно культивировать людей - видимо, дорожная карта для MVC 5 содержит более интуитивные помощники DropDownList.
Когда вы выполните:
@Html.DropDownListFor(x => x.TimeOption ...)
... HTML-помощник сделает все возможное, чтобы не использовать значение, установленное в Selected = true
, в SelectList
. Он будет:
- Попробуйте получить его из
ModelState
- который он не получит по запросу GET - Попробуйте получить его из
ViewData
- который он получит, потому что у вас есть свойствоTimeOption
на вашей модели.
Только если обе эти попытки потерпят неудачу, они будут поддаваться и использовать то, что вы просили использовать.
Итак, в вашем случае оно будет использовать текущее значение TimeOption
для вашей модели в качестве выбранного значения. Что должно быть хорошо, потому что все, что вы просили в своем SelectList
в любом случае ((int)Model.TimeOption
), правильно?
Неправильно. Потому что он не будет передавать ваше свойство (enum
?) В int
, как вы. Он преобразует его в строку. Для enum
, который дает имя перечисления - например. PastMonth
. Если TimeOption
является вашим собственным классом, это будет результат ToString()
.
Затем, когда он не находит эту строку в качестве одного из ваших значений <select>
(потому что все они целые), он решает не делать ничего выбранного.
Короче: SelectListItem.Selected
не влияет на помощника. Если ваш вспомогательный вызов указывает имя (буквально или через выражение лямбда), помощник будет использовать что-либо в ModelState
или ViewData
с этим именем и преобразовать его в строку.
В большинстве случаев это происходит с перечислениями. Самый простой способ обойти это - использовать имя перечисления, а не его int-представление, как значение для SelectListItem
.