调用 get 操作时未设置 ViewBag 属性

ViewBag property not getting set when get action is called

在 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 上遇到异常时,我想再次传递模型和 return 相同的创建视图。但是,即使每次调用 Create Get 方法时我都有设置 ViewBag.Colors 的代码,但它没有被设置,并且在渲染 Create View 时出现错误 -

具有键 'Color' 的 ViewData 项是 'System.String' 类型,但必须是 'IEnumerable' 类型。

我确实在其他一些 post 中发现了这个异常的原因是 ViewBag.Colors 是 null ,但我不明白为什么。为什么在从 Post 操作方法调用视图时没有设置?解决这个问题的方法是什么?

之前

return View(producttocreate);

喜欢这个

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

ViewBag.Colors 为空的原因是当 POST 中出现错误时,您没有重定向到 (GET) 创建操作。相反,您将模型发送回视图,绕过 (GET) 创建操作,因此不会填充 ViewBag。如果您使用 RedirectToAction("Create"); 而不是 View(producttocreate),则会再次填充 ViewBag.Colors。