我有一个选择列表项存储在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?该键如何工作?
屏幕截图:
答案 0 :(得分:0)
您可能想得太多。简单考虑一下...
两个动作都返回相同的视图:
public ActionResult New()
{
//...
return View();
}
该视图使用ViewBag
中的值:
(IEnumerable<SelectListItem>)ViewBag.Categories
为了使视图使用该值,该值必须位于ViewBag
中。因此,返回该视图的任何操作都需要填充该值。这就是为什么当您不填充该值时会出现错误的原因。该错误告诉您正在尝试使用不存在的ViewBag
值。