【发布时间】:2019-04-11 18:47:40
【问题描述】:
在 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 视图。但是,即使每次调用 Create Get 方法时我都有设置 ViewBag.Colors 的代码,但它没有被设置,并且在渲染 Create View 时出现错误 -
具有键“Color”的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable”类型。
我确实在其他一些帖子中发现此异常的原因是 ViewBag.Colors 为 null ,但我不明白为什么。为什么从 Post Action 方法调用 View 时没有设置它?对此有什么解决办法?
【问题讨论】:
-
那么,您的代码在初始页面加载时工作,但是当您尝试提交表单并返回相同的视图时出现异常?下拉菜单是表单上的必填字段吗?
-
M12 Bennett - 是的,它适用于初始页面加载。当我发布数据时,如果发布成功,我想返回一个索引视图,如果它不成功,我希望它返回相同的视图。正是在这一点上,我希望 ViewBag.Colors 再次在 GET 方法中设置,因为它在代码中,但它设置为 null。
-
M12 Bennett - 关于问题的另一部分,不是它不是必填字段,如在模型类中的属性上没有应用必填属性。
-
好的,明白了。需要明确的是,如果post不成功,它不会回到
HttpGet方法。它将保留在 HttpPost 方法中,这意味着您必须在 HttpPost 方法中再次设置ViewBag.Colors。过去我也遇到过这种情况,我通常在方法开始时就设置它。不过这取决于你。
标签: c# asp.net-mvc viewbag selectlistitem