ModelState.IsValid == false,为什么?

我在哪里可以find使ModelState无效的错误列表? 我没有看到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。

由于你可能在Visual Studio中编程,所以你最好利用断点的简单debugging步骤的可能性(了解你的情况是什么问题)。 只要将它们放置在检查ModelState.isValid的地方就可以了,然后将鼠标hover在ModelState上。 现在,您可以轻松浏览内部的所有值,查看导致isvalid返回错误的错误。

的ModelState

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

或迭代

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

有时绑定器会抛出一个没有错误信息的exception。 你可以通过下面的代码来检索exception,找出最新的错误:

(通常如果活页夹试图将string转换为复杂types等)

  if (!ModelState.IsValid) { var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception)); // Breakpoint, Log or examine the list with Exceptions. } 

将下面的代码粘贴到控制器的ActionResult中,然后放置debugging器。

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

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

就像我刚刚发生的那样 – 当您在不更新表单的情况下将所需的属性添加到模型中时,也会发生这种情况。 在这种情况下,ValidationSummary将不会列出错误消息。