Метод Post Post Нет элемента ViewData типа 'IEnumerable <SelectListItem>', который имеет ключ 'DepartmentId' - PullRequest
1 голос
/ 29 мая 2019

Выпадающий список генерируется идеально по методу HttpGet для Create Action. Но когда дело доходит до HttpPost Action Create, он компилирует эту ошибку:

Нет элемента ViewData типа 'IEnumerable', который имеет ключ «Идентификатор отдела».

Я знаю, что этот вопрос задавался несколько раз. Я действительно попробовал большинство методов, таких как:

  1. изменение названия списка.
  2. Поместить список выбора в данные просмотра вместо ViewBag
  3. Приведите ViewBag.Departments в моем представлении к IEnumerable или SelectList

Ни одно из этих испытаний не решило мою проблему. Вот мой код:

[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" })

1 Ответ

1 голос
/ 29 мая 2019

Так же, как говорится об ошибке, 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...