如果ModelState.IsValid失败,请获取错误消息?

Ste*_*ven 65 c# asp.net asp.net-mvc

我在我的控制器中有这个功能.

[HttpPost]
public ActionResult Edit(EmployeesViewModel viewModel)
{
    Employee employee = GetEmployee(viewModel.EmployeeId);
    TryUpdateModel(employee);

    if (ModelState.IsValid)
    {
        SaveEmployee(employee);
        TempData["message"] = "Employee has been saved.";
        return RedirectToAction("Details", new { id = employee.EmployeeID });
    }

    return View(viewModel); // validation error, so redisplay same view
}
Run Code Online (Sandbox Code Playgroud)

它一直失败,ModelState.IsValid不断返回false并重新显示视图.但我不知道错误是什么.

有没有办法获取错误并将其重新显示给用户?

Cap*_*chi 126

试试这个

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    var errors = ModelState.Select(x => x.Value.Errors)
                           .Where(y=>y.Count>0)
                           .ToList();
}
Run Code Online (Sandbox Code Playgroud)

错误将是所有错误的列表.

如果要向用户显示错误,您只需将模型返回到视图,如果尚未删除Razor @Html.ValidationFor()表达式,它将显示出来.

if (ModelState.IsValid)
{
    //go on as normal
}
else
{
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

该视图将显示每个字段旁边和/或ValidationSummary中的任何验证错误(如果存在).


Joh*_*yHK 76

如果您要生成包含ModelState错误消息的单个错误消息字符串,则可以使用该错误消息SelectMany将错误展平为单个列表:

if (!ModelState.IsValid)
{
    var message = string.Join(" | ", ModelState.Values
        .SelectMany(v => v.Errors)
        .Select(e => e.ErrorMessage));
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}
Run Code Online (Sandbox Code Playgroud)

  • 有时不提供`ErrorMessage`,例如,如果未设置所需的`DateTime`字段.在这种情况下,查找异常消息,例如`e.Exception.Message`. (9认同)

Dan*_*fer 32

您可以在视图中执行此操作,而无需在操作中执行任何特殊操作,方法是使用Html.ValidationSummary()显示所有错误消息,或者使用Html.ValidationMessageFor()显示模型特定属性的消息.

如果仍需要查看操作或控制器中的错误,请参阅ModelState.Errors属性

  • 没有ModelState.Errors属性?! (10认同)
  • @niico ModelState.Error仅适用于MVC,不存在WebAPI (3认同)

Sac*_*ant 5

如果模态状态无效并且因为您的控件处于折叠折叠状态而无法在屏幕上看到错误,则可以返回HttpStatusCode,以便在执行F12时显示实际的错误消息.您也可以将此错误记录到ELMAH错误日志中.下面是代码

if (!ModelState.IsValid)
{
              var message = string.Join(" | ", ModelState.Values
                                            .SelectMany(v => v.Errors)
                                            .Select(e => e.ErrorMessage));

                //Log This exception to ELMAH:
                Exception exception = new Exception(message.ToString());
                Elmah.ErrorSignal.FromCurrentContext().Raise(exception);

                //Return Status Code:
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
}
Run Code Online (Sandbox Code Playgroud)

但请注意,此代码将记录所有验证错误.因此,只有在出现无法在屏幕上看到错误的情况时才应使用此选项.


cod*_*key 5

如果有人在这里使用 WebApi(不是 MVC),您只需返回ModelState对象:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);