Выпадающий список идеально создается с помощью метода HttpGet для создания действия. Но когда дело доходит до HttpPost Action Create, он компилирует эту ошибку:
There is no ViewData item of type 'IEnumerable' that has the key 'DepartmentId'.
Я знаю, что этот вопрос задавался несколько раз. Я действительно пробовал большинство методов, таких как:
Ни одно из этих испытаний не решило мою проблему. Вот мой код:
[HttpGet]
[ActionName("Create")]
public ActionResult Create_Get()
{
using (MyConnectionString _context = new MyConnectionString())
{
var list = (from d in _context.Departments
select new
{
d.DepartmentId,
d.DepartmentName
}).ToList();
SelectList dList = new SelectList(list, "DepartmentId", "DepartmentName");
ViewBag.DepartmentId = dList;
}
Employee employee = new Employee();
return View(employee);
}
[HttpPost]
[ActionName("Create")]
public ActionResult Create_Post()
{
if (ModelState.IsValid)
{
Employee employee = new Employee();
TryUpdateModel(employee);
if (ModelState.IsValid)
{
using (MyConnectionString _context = new MyConnectionString())
{
_context.Employees.Add(employee);
_context.SaveChanges();
}
return RedirectToAction("Index");
}
}
return View();
}
Вид:
@Html.DropDownList("DepartmentId", ViewBag.DepartmentId as IEnumerable<SelectListItem>, new { @class = "form-control" })
Вы хотите, чтобы я также отображал действие HttpPost? @Дэйвид
Ну, если проблема возникает в вашем [HttpPost]
действии, то вы наверное хотите взглянуть на ваше [HttpPost]
действие.
@David Готово, теперь ты можешь это увидеть
Как говорится в ошибке, у ViewBag
нет таких данных. Обратите внимание, как вы устанавливаете это значение в своем [HttpGet]
действии:
ViewBag.DepartmentId = dList;
Поэтому, когда вы возвращаете представление, это значение доступно для представления. Ваше действие [HttpPost]
возвращает тот же вид. Но он возвращает его без какой-либо модели и, в частности, в отношении этой ошибки, даже не устанавливая ничего в ViewBag
.
Прежде чем вернуть представление, установите нужные значения ViewBag
в действии контроллера. Точно так же, как вы уже делаете в своем [HttpGet]
действии.
(Поскольку функциональность будет повторяться, вам, конечно, рекомендуется извлекать ее в общий метод, а не просто копировать/вставлять весь тот же код. Вам также рекомендуется использовать модель вместо того, чтобы полагаться на ViewBag
, но это может просто сведитесь к вопросу о личных предпочтениях.)
Редактировать:Как указано в комментарии ниже, пример:
Например, обратите внимание, как вы устанавливаете значение ViewBag
в своем действии [HttpGet]
:
using (MyConnectionString _context = new MyConnectionString())
{
var list = (from d in _context.Departments
select new
{
d.DepartmentId,
d.DepartmentName
}).ToList();
SelectList dList = new SelectList(list, "DepartmentId", "DepartmentName");
ViewBag.DepartmentId = dList;
}
Если вы хотите установить точно такое же значение в своем действии [HttpPost]
, просто выполните то же самое:
if (ModelState.IsValid)
{
// ... the code you have in here is unchanged
}
using (MyConnectionString _context = new MyConnectionString())
{
var list = (from d in _context.Departments
select new
{
d.DepartmentId,
d.DepartmentName
}).ToList();
SelectList dList = new SelectList(list, "DepartmentId", "DepartmentName");
ViewBag.DepartmentId = dList;
}
return View();
не могли бы вы добавить пример после вашего объяснения. я не понял что ты имеешь в виду 100%. И спасибо @David
@markdibe: ответ обновлен. Но у вас уже есть пример... Ваша [HttpGet]
акция. Если вы хотите установить точно такое же значение в своем действии [HttpPost]
, вы должны установить это значение точно так же. Все, что вам нужно сделать, это то же самое, что вы уже сделали.
Но как я узнаю, какое значение (id) выбрано, если я просто регенерирую ViewBag? @Дэйвид
@markdibe: Это звучит как совершенно другой вопрос. Где вы вообще фиксируете или сохраняете выбранное значение? Ваше действие [HttpPost]
не получает никаких данных. Вы каким-то образом извлекаете эти данные из объекта Request
прямо в TryUpdateModel()
? Если да, то там у вас будет эта информация. Хотя вам рекомендуется использовать привязку модели вместо прямого доступа к объекту Request
для значений формы. Но показанный код не включает в себя сообщение формы или выбранное значение или что-либо в этом роде. Это касается только той ошибки, о которой вы спрашиваете.
можно 5 минут от твоего времени? в чате, пожалуйста
Список отделов взят из базы данных, у меня есть deprartmentId в модели Employee. DepartmentId должен быть заполнен из уже заполненного выпадающего списка
@markdibe: В идеале ваше действие [HttpPost]
должно получать модель в качестве аргумента метода, наверное — экземпляр Employee
. Имена элементов формы должны совпадать с именами свойств модели. Это будет то место, где выбранное значение известно. Однако это не имеет отношения к заданному выше вопросу. Пожалуйста, поймите, что ветка комментариев Stack Overflow не заменяет учебные пособия и практику. Вам рекомендуется ознакомиться с некоторыми вводными руководствами по ASP.NET MVC и начать с нескольких простых примеров публикации формы.
@markdibe: Если вы устранили ошибку в вопросе и столкнулись с новой проблемой, вам предлагается опубликовать новый вопрос о переполнении стека с подробностями этой проблемы.
Но ваш ответ не решил проблему. Он продолжает выдавать ту же проблему
@markdibe: Вы пробовали предложенный подход в этом ответе? Ошибка из вопроса все еще присутствует? Покажите свой обновленный код в вопросе и, если ошибка изменилась в любом случае, включите обновленную ошибку.
Да все равно с той же ошибкой. Я только что скопировал то, что вы сделали
@markdibe: Пожалуйста, не пытайтесь редактировать информацию в ответах, вместо этого вы должны редактировать информацию в вопросе. Пожалуйста, также не используйте скриншоты кода, так как их нельзя найти/скопировать/и т.д. и их трудно читать. Что касается информации, которую вы пытались передать... На скриншоте вы устанавливаете значение ViewBag
при возврате перенаправить. Вам нужно установить его при возврате Посмотреть, так как ошибка происходит в этом представлении.
Большое спасибо Дэвиду за вашу помощь. проблема заключалась в том, что я должен снова вызвать viewbag, прежде чем проверять, действительна ли модель или нет.
извините, я думал, что добавляю это к своему вопросу. Прости еще раз
[HttpGet]
. Можете ли вы прояснить проблему?