После метода Post Нет элемента ViewData типа «IEnumerable<SelectListItem>», который имеет ключ «DepartmentId»

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

There is no ViewData item of type 'IEnumerable' that has the key 'DepartmentId'.

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

  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" })
"когда дело доходит до действия HttpPost" — код, который вы показываете, не имеет действия HTTP POST. Обратите внимание на атрибут метода [HttpGet]. Можете ли вы прояснить проблему?
David 29.05.2019 14:44

Вы хотите, чтобы я также отображал действие HttpPost? @Дэйвид

Mark Dibeh 29.05.2019 14:45

Ну, если проблема возникает в вашем [HttpPost] действии, то вы наверное хотите взглянуть на ваше [HttpPost] действие.

David 29.05.2019 14:45

@David Готово, теперь ты можешь это увидеть

Mark Dibeh 29.05.2019 14:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
547
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как говорится в ошибке, у 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

Mark Dibeh 29.05.2019 14:55

@markdibe: ответ обновлен. Но у вас уже есть пример... Ваша [HttpGet] акция. Если вы хотите установить точно такое же значение в своем действии [HttpPost], вы должны установить это значение точно так же. Все, что вам нужно сделать, это то же самое, что вы уже сделали.

David 29.05.2019 14:58

Но как я узнаю, какое значение (id) выбрано, если я просто регенерирую ViewBag? @Дэйвид

Mark Dibeh 29.05.2019 14:59

@markdibe: Это звучит как совершенно другой вопрос. Где вы вообще фиксируете или сохраняете выбранное значение? Ваше действие [HttpPost] не получает никаких данных. Вы каким-то образом извлекаете эти данные из объекта Request прямо в TryUpdateModel()? Если да, то там у вас будет эта информация. Хотя вам рекомендуется использовать привязку модели вместо прямого доступа к объекту Request для значений формы. Но показанный код не включает в себя сообщение формы или выбранное значение или что-либо в этом роде. Это касается только той ошибки, о которой вы спрашиваете.

David 29.05.2019 15:01

можно 5 минут от твоего времени? в чате, пожалуйста

Mark Dibeh 29.05.2019 15:04

Список отделов взят из базы данных, у меня есть deprartmentId в модели Employee. DepartmentId должен быть заполнен из уже заполненного выпадающего списка

Mark Dibeh 29.05.2019 15:10

@markdibe: В идеале ваше действие [HttpPost] должно получать модель в качестве аргумента метода, наверное — экземпляр Employee. Имена элементов формы должны совпадать с именами свойств модели. Это будет то место, где выбранное значение известно. Однако это не имеет отношения к заданному выше вопросу. Пожалуйста, поймите, что ветка комментариев Stack Overflow не заменяет учебные пособия и практику. Вам рекомендуется ознакомиться с некоторыми вводными руководствами по ASP.NET MVC и начать с нескольких простых примеров публикации формы.

David 29.05.2019 15:14

@markdibe: Если вы устранили ошибку в вопросе и столкнулись с новой проблемой, вам предлагается опубликовать новый вопрос о переполнении стека с подробностями этой проблемы.

David 29.05.2019 15:15

Но ваш ответ не решил проблему. Он продолжает выдавать ту же проблему

Mark Dibeh 29.05.2019 15:15

@markdibe: Вы пробовали предложенный подход в этом ответе? Ошибка из вопроса все еще присутствует? Покажите свой обновленный код в вопросе и, если ошибка изменилась в любом случае, включите обновленную ошибку.

David 29.05.2019 15:16

Да все равно с той же ошибкой. Я только что скопировал то, что вы сделали

Mark Dibeh 29.05.2019 15:17

@markdibe: Пожалуйста, не пытайтесь редактировать информацию в ответах, вместо этого вы должны редактировать информацию в вопросе. Пожалуйста, также не используйте скриншоты кода, так как их нельзя найти/скопировать/и т.д. и их трудно читать. Что касается информации, которую вы пытались передать... На скриншоте вы устанавливаете значение ViewBag при возврате перенаправить. Вам нужно установить его при возврате Посмотреть, так как ошибка происходит в этом представлении.

David 29.05.2019 15:23

Большое спасибо Дэвиду за вашу помощь. проблема заключалась в том, что я должен снова вызвать viewbag, прежде чем проверять, действительна ли модель или нет.

Mark Dibeh 29.05.2019 15:25

извините, я думал, что добавляю это к своему вопросу. Прости еще раз

Mark Dibeh 29.05.2019 15:27

Другие вопросы по теме