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

我在我的控制器中有这个function。

[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 } 

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

有没有办法得到错误,并重新显示给用户?

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

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

尝试这个

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

错误将成为所有错误的列表。

如果您正在寻找生成包含ModelState错误消息的单个错误消息string,则可以使用SelectMany将这些错误平铺到一个列表中:

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

如果模式状态不是有效的,并且屏幕上看不到错误,因为您的控件处于折叠式手风琴中,那么您可以返回HttpStatusCode,以便在执行F12时显示实际的错误消息。 您也可以将此错误logging到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); } 

但是请注意,这段代码会logging所有的validation错误。 所以只有在屏幕上看不到错误的情况下才能使用。

我不知道这是否是您的问题,但如果您添加一个用户,然后更改您的应用程序的名称,该用户将保留在数据库(当然),但将无效(这是正确的行为)。 但是,这种types的失败将不会有错误。 错误列表是空的,但是ModelState.IsValid将为login返回false。

确定检查并添加到观察:

  1. 在您的代码中的ModelState行中执行一个断点
  2. 将您的模型状态添加到您的手表
  3. 展开ModelState“值”
  4. 展开值“结果视图”

现在,您可以在值的结尾看到具有validation状态的所有SubKey的列表。

所以search无效值