Свойство ViewBag не устанавливается, когда вызывается действие get - PullRequest
0 голосов
/ 11 апреля 2019

В проекте MVC, в первую очередь в EF DB, я использую свойство ViewBag для отображения списка значений в раскрывающемся списке. Вот мой метод get и метод post для того же .-

[ HttpGet]
        public ActionResult Create()
        {

            using (var context = new AdventureWorksEntities())
            {
    ViewBag.Colors = new SelectList(context.Products.Select(a => 
    a.Color).Distinct().ToList());
            }

            return View();

 [HttpPost]
        [ActionName("Create")]
        public ActionResult CreatePost()
        {
            var producttocreate = new Product();
        try
            {
                UpdateModel(producttocreate);
                if (ModelState.IsValid)
                {
                    using (var context = new AdventureWorksEntities())
                    {
                        context.Products.Add(producttocreate);
                        context.SaveChanges();
                    }
                    return RedirectToAction("Index");
                }
                return View(producttocreate);
            }
            catch(Exception e)
            {
                return View(producttocreate);
            }

    }

Здесь свойство ViewBag.Colors является рассматриваемым свойством. Когда я получаю исключение для Post, я хочу передать модель и снова вернуть то же представление Create. Однако, хотя у меня есть код для установки ViewBag.Colors при каждом вызове метода Create Get, он не устанавливается, и я получаю сообщение об ошибке, когда Create View выполняет рендеринг -

Элемент ViewData, имеющий ключ 'Color', имеет тип 'System.String', но должен иметь тип 'IEnumerable' .

Я обнаружил в каком-то другом посте, что причиной этого исключения является то, что ViewBag.Colors имеет значение null, но я не понимаю, почему. Почему он не устанавливается, когда View вызывается из метода Post Action? И как это можно решить?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Причина, по которой ViewBag.Colors равен нулю, заключается в том, что при возникновении ошибки в POST вы не перенаправляетесь на действие (GET) Create. Вместо этого вы отправляете модель обратно в представление, минуя действие (GET) Create, таким образом не заполняя ViewBag. Если вы сделали RedirectToAction("Create"); вместо View(producttocreate), ViewBag.Colors будет заполнен снова.

0 голосов
/ 11 апреля 2019

До

return View(producttocreate);

делай так

ViewData["Colors"] = new SelectList(_context.Products, "Id", "Color", ColorId);
...