У меня следующая модель представления
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
и следующий метод контроллера для создания нового проекта и назначения Category
public ActionResult Create()
{
ProjectVM model = new ProjectVM
{
CategoryList = new SelectList(db.Categories, "ID", "Name")
}
return View(model);
}
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Save and redirect
}
и в представлении
@model ProjectVM
....
@using (Html.BeginForm())
{
....
@Html.LabelFor(m => m.CategoryID)
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryID)
....
<input type="submit" value="Create" />
}
Представление отображается правильно, но при отправке формы я получаю следующее сообщение об ошибке
InvalidOperationException: элемент ViewData с ключом CategoryID относится к типу System.Int32, но должен иметь тип IEnumerable <SelectListItem>.
Та же ошибка возникает при использовании этого @Html.DropDownList()
метода, и если я передаю SelectList с помощью ViewBag
или ViewData
.
согласно Stephens (user3559349) ответ , это может быть полезно:
или в ProjectVM:
источник
Скорее всего, возникла какая-то ошибка перенаправления на вашу страницу, и вы снова не инициализируете раскрывающиеся списки своей модели.
Убедитесь, что вы инициализируете раскрывающиеся списки либо в конструкторе модели, либо каждый раз перед отправкой указанной модели на страницу.
В противном случае вам нужно будет поддерживать состояние раскрывающихся списков либо с помощью панели просмотра, либо с помощью помощников по скрытым значениям.
источник
У меня была та же проблема, я получал недопустимое состояние ModelState, когда пытался опубликовать форму. Для меня это было вызвано установкой CategoryId на int, когда я изменил его на строку, ModelState был действителен, а метод Create работал должным образом.
источник
Хорошо, готовый ответ плаката аккуратно объяснил, почему произошла ошибка, но не как заставить ее работать. Я не уверен, что это действительно ответ, но он указал мне правильное направление.
Я столкнулся с той же проблемой и нашел удобный способ ее решить. Я постараюсь зафиксировать это здесь. Отказ от ответственности - я работаю над веб-страницами примерно раз в год и действительно не знаю, что делаю большую часть времени. Этот ответ ни в коем случае нельзя считать «экспертным», но он выполняет свою работу с небольшим трудом ...
Учитывая, что у меня есть некоторый объект данных (скорее всего, объект передачи данных), я хочу использовать раскрывающийся список для предоставления допустимых значений для поля, например:
Тогда ViewModel выглядит так:
Настоящая проблема здесь, как красноречиво описал @Stephen выше, заключается в том, что список выбора не заполняется методом POST в контроллере. Итак, ваши методы контроллера будут выглядеть так:
Вот и все. Это НЕ рабочий код, я скопировал / вставил и отредактировал, чтобы упростить его, но вы поняли идею. Если элементы данных как в исходной модели данных, так и в производной модели представления имеют одно и то же имя, UpdateModel () выполняет отличную работу по заполнению только нужных данных из значений FormCollection.
Я публикую это здесь, чтобы найти ответ, когда я неизбежно снова столкнусь с этой проблемой - надеюсь, это поможет и кому-то другому.
источник
В моем случае первый идентификатор в моем списке был нулевым, как только я изменил идентификатор, чтобы начать с 1, это сработало.
источник