我在哪里可以找到使 ModelState 无效的错误列表?我没有在 ModelState 对象上看到任何错误属性。
9 回答
由于您可能正在 Visual Studio 中进行编程,因此您最好利用断点的可能性来进行如此简单的调试步骤(了解您的情况是什么问题)。只需将它们放在您检查 ModelState.isValid 的前面/位置,然后将鼠标悬停在 ModelState 上。现在您可以轻松浏览其中的所有值并查看导致 isvalid 返回 false 的错误。
将以下代码粘贴到控制器的 ActionResult 中,并将调试器放置在此处。
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();
关于“可能是 0 个错误和 IsValid == false”:这是来自https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41的 MVC 源代码
public bool IsValid {
get {
return Values.All(modelState => modelState.Errors.Count == 0);
}
}
现在看来,不可能了。好吧,这适用于 ASP.NET MVC v1。
bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);
或迭代
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
有时,活页夹会抛出没有错误消息的异常。您可以使用以下代码段检索异常以找出问题所在:
(通常,如果活页夹试图将字符串转换为复杂类型等)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
如果您删除对 ModelsState.IsValid 的检查并让它出错,如果您复制此行((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
并将其粘贴到 Visual Studio 的 watch 部分,它将准确地告诉您错误是什么。节省大量时间检查错误所在。
控制器上的 ModelState 属性实际上是一个 ModelStateDictionary 对象。您可以遍历字典上的键并使用 IsValidField 方法检查该特定字段是否有效。
正如我刚刚发生的那样 - 当您向模型添加必需的属性而不更新表单时也会发生这种情况。在这种情况下,ValidationSummary 不会列出错误消息。
我将一些 JSON 粘贴到 MS Teams Wiki 页面中以供将来参考,当我将其复制回来以供使用时,它添加了额外的不可见字符。我通过在 JSONLint 上linting确认了这一点
删除多余的字符为我解决了这个错误。