验证失败后,MVC5创建具有下拉列表的视图失败

时间:2016-04-01 15:11:47

标签: asp.net-mvc validation

我有一个MVC5视图,允许用户创建对象。我为新的get请求生成的Create视图绑定到强类型模型。该模型包含我填充的SelectListItems,因此用户可以选择一些列表。用户进行一些选择捣碎保存并返回到我的控制器中的后期操作并保存记录一切都很好。 但是,如果存在验证错误 - 如空字段 - 我想在我的帖子Create ActionResult中处理它。所以我写了一个验证器,我检查了所有内容,并在模型状态下加载错误消息。 然后我打电话给:

return View (m)

我希望返回与模型相同的视图,以便用户看到他们已经输入的内容,错误显示在摘要部分,他们可以修复这些并继续前进。 问题是页面中断了,因为我之前填写的SelectListItems中没有任何项目。我可以看到调用后ActionResult的时候我的模型m具有我需要的所有值来创建新的记录,但SelectLists为空。

如何将页面显示给有错误的用户?

        [HttpPost]
    public ActionResult Create(CreateNewProjectModel m, UserInfoCookie userCookie, string redirect, string submitButton)
    {
        var mValidateResults = ProjectDetailsValidator.Validate(m);
        if (!mValidateResults.IsValid)
        {
            //loop over each error
            foreach (var e in mValidateResults.Errors)
            {
                ModelState.AddModelError(e.PropertyName, e.ErrorMessage);
            }
            return View(m);}}

1 个答案:

答案 0 :(得分:1)

请记住, HTTP是无状态。在您的代码中,您将再次返回视图。但您不是(重新)加载用于填充下拉内容的属性。

因此,在返回数据之前,您需要再次为下拉列表填充数据。

//Validation failed, Let's reload data and return to the view
// Hard coded for demo. you may get it from db
m.States = new List<SelectListItem> { 
  new SelectListItem { Value="1", Text="Michigan"},
  new SelectListItem { Value="2", Text="Texas"}
};
return View(m);

假设您的CreateNewProjectModel视图模型具有类型为States的{​​{1}}属性,并使用它来呈现您的下拉列表。

List<SelectListItem>