如果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。
确定检查并添加到观察:
- 在您的代码中的ModelState行中执行一个断点
- 将您的模型状态添加到您的手表
- 展开ModelState“值”
- 展开值“结果视图”
现在,您可以在值的结尾看到具有validation状态的所有SubKey的列表。
所以search无效值 。