为什么还要在HttpPost Action中传递SelectList的ViewBag?

时间:2019-05-27 22:05:10

标签: asp.net-mvc

我有一个选择列表项存储在ViewBag中。我不明白为什么我们应该在HttpGet和HttpPost操作中都声明此ViewBag?

如果我们不在HttpPost操作中再次声明它,则验证将无法进行,并且将获得异常。 但这在技术上是如何发生的?


动作:

    public ActionResult New()
    {
        ViewBag.Categories = new SelectList(db.Categories.ToList(),"Id", "Name");
        return View();

    }

    [HttpPost]
    public ActionResult New(Article article)
    {
        ViewBag.Categories = new SelectList(db.Categories.ToList(), "Id", "Name");
        if(ModelState.IsValid)
        {
            string FullName = HttpContext.GetOwinContext()
               .GetUserManager<ApplicationUserManager>()
               .FindById(User.Identity.GetUserId()).FullName;

            article.AuthorName = FullName;
            article.UserId = User.Identity.GetUserId();
            db.Aricles.Add(article);
            db.SaveChanges();
            return RedirectToAction("All");

        }
        return View();
    }

列表:

@Html.DropDownListFor(m => m.CategoryId, (IEnumerable<SelectListItem>)ViewBag.Categories, "Select Category", new { @class = "form-control" })

从HttpPost Action中删除ViewBag时引发的异常。 我想知道为什么
键= CategoryId?该键如何工作?

屏幕截图:

Screenshot

1 个答案:

答案 0 :(得分:0)

您可能想得太多。简单考虑一下...

两个动作都返回相同的视图:

public ActionResult New()
{
    //...
    return View();
}

该视图使用ViewBag中的值:

(IEnumerable<SelectListItem>)ViewBag.Categories

为了使视图使用该值,该值必须位于ViewBag中。因此,返回该视图的任何操作都需要填充该值。这就是为什么当您不填充该值时会出现错误的原因。该错误告诉您正在尝试使用不存在的ViewBag值。