【问题标题】:MVC5 Create View with Dropdowns fails when validation is not successful验证不成功时,MVC5 Create View with Dropdowns 失败
【发布时间】:2016-04-01 23:16:37
【问题描述】:

我有一个 MVC5 视图来允许用户创建对象。我为新的获取请求生成的创建视图绑定到强类型模型。该模型包含我填充的 ​​SelectListItems,因此用户有一些列表可供选择。用户做出一些选择并保存,它会回到我的控制器中的发布操作,并很好地保存记录。 但是,如果有验证错误——比如一个空字段——我想在我的帖子 Create ActionResult 中处理它。所以我写了一个验证器,我检查了一切,我在我的模型状态中加载了错误消息。 然后我打电话:

return View (m)

我想返回与其中的模型相同的视图,以便用户看到他们已经输入的内容,并且错误显示在摘要部分中,他们可以修复这些并继续前进。 问题是分页符是因为我之前填写的 SelectListItems 中没有任何项目。我可以看到何时调用 post 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);}}

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案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 类型的 List&lt;SelectListItem&gt; 属性,并且您使用它来呈现您的下拉菜单。

    @model YourViewModel
    @using(Html.BeginForm)
    {
      @Html.TextBoxFor(x=>x.FirstName)
      @Html.DropDownListFor(s=>s.SelectedState,Model.States)
      <input type="submit" />
    }
    

    【讨论】:

    • 这是有道理的。但是为什么这些列表一开始没有随帖子一起发送呢?
    • 这是设计使然。它发回表单字段的值(下拉列表的选定值),而不是用于构建下拉列表的数据。在 Web 表单中,他们过去常常将其保持在视图状态,并且将其作为帖子的一部分在 2 次调用之间进行持久化。在 MVC 中,没有视图状态概念 :) 干净。你需要重新加载它。每次 HTTP 是无状态的时,MVC 都会提醒我们,我们用愚蠢的 Web 表单忘记了这一点:)
    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2019-05-04
    • 2021-06-17
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多