Неверное исключение приведения при использовании Enum в качестве источника данных для DropDownListFor - PullRequest
0 голосов
/ 02 октября 2019

Я конвертирую enum в IEnumerable<SelectListItem> в моем контроллере, чтобы использовать его в DropDownListFor помощнике.

var roleList = EnumHelper.GetSelectList(typeof(UserRole))
           .Cast<UserRole>()
           .Except(new UserRole[] { UserRole.Admin, UserRole.Corporate })
           .Select(e => new SelectListItem { Text = e.ToString(), Value = ((int)e).ToString() });
ViewBag.SelectList = roleList;

и мой код бритвы выглядит как

@Html.DropDownListFor(m => m.RoleID, (IEnumerable<SelectListItem>)ViewBag.SelectList)

, ноЯ получаю сообщение об ошибке

System.InvalidCastException: указанное преобразование недопустимо.

Чтобы убедиться, что это допустимое приведение, я проверил тип данных roleList в контроллереи выглядит нормально, как показано ниже

cast error

во время выполнения. Я гарантировал, что ViewBag.SelectList не является нулевым при отладке, и нет проблем

Debug mode

, но когда я расширяю результат, я получаю сообщение об ошибке

error finally

1 Ответ

1 голос
/ 02 октября 2019

EnumHelper.GetSelectList возвращает IList<SelectListItem>, а затем Cast<UserRole>() создает исключение, потому что не может привести SelectListItem к UserRole. Чтобы получить все значения enum, используйте Enum.GetValues

var roleList = Enum.GetValues(typeof(UserRole))
       .Cast<UserRole>()
       .Except(new UserRole[] { UserRole.Admin, UserRole.Corporate })
       .Select(e => new SelectListItem { Text = e.ToString(), Value = ((int)e).ToString() });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...