IsValid = = false,为什么?

在哪里可以找到使 ModelState 无效的错误列表?我在 ModelState 对象上没有看到任何错误属性。

169076 次浏览

控制器上的 ModelState 属性实际上是一个 ModelStateDictionary 对象。您可以循环遍历 dictionary 上的键,并使用 IsValidField 方法检查该特定字段是否有效。

bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

或者重复

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{


}

由于您可能正在 Visual Studio 中编程,因此您最好利用使用断点的可能性来完成这些简单的调试步骤(了解您的案例中的问题是什么)。只需将它们放在检查 ModelState.isValid 的前面/位置,然后将鼠标悬停在 ModelState 上。现在,您可以轻松地浏览内部的所有值,并查看是什么错误导致有效的返回值为 false。

modelstate

关于“会不会是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的。

有时,活页夹会抛出没有错误消息的异常。 您可以使用下面的代码片段检索异常,以找出问题所在:

(通常,如果活页夹试图将字符串转换为复杂类型等)

 if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));


// Breakpoint, Log or examine the list with Exceptions.


}

正如刚才发生在我身上的一样——当您向模型中添加一个必需的属性而不更新表单时,也会发生这种情况。在这种情况下,ValidationSummary 将不会列出错误消息。

将下面的代码粘贴到控制器的 ActionResult 中,并将调试器放在此处。

var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();

如果删除 ModelsState.IsValid 的检查并让它发生错误,如果复制这一行 ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors并将其粘贴到 Visual Studio 的 watch 部分,那么它将准确地告诉您错误是什么。节省了检查错误位置的大量时间。

我将一些 JSON 粘贴到 MS Teams Wiki 页面以备将来参考,当我将其复制回来使用时,它添加了额外的不可见字符。我在 JSONLint点确认了这一点

删除额外的字符为我修复了这个错误。

Visual Studio 2022 + dotnet 6更新:

很长一段时间我都有同样的问题,最后我找到了。在我的例子中,它是 Id 字段:)

只需要放置一个断点并在运行时检查 ModelState,然后转到下面的部分:

ModelState-> Root-> Children

您将看到所有有效和无效的密钥

enter image description here