ModelState.IsValid == false,为什么?


120

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

Answers:


45

关于“可能是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的。


在我看来,它应该不应该,Values.All(modelState => modelState.Errors.Count == 0)是否有问题?
Omu

注意错误可以是Message或Exception;例如Html.ValidationSummary不显示异常(我猜出于安全原因);也许这就是为什么您看不到错误?您如何检查没有错误?
queen3

1
ModelState.IsValid给出了错误
Omu

哈哈,这很明显...您如何检查“值有0个错误”?
queen3

258

因为您可能正在Visual Studio中进行编程,所以最好利用使用断点的可能性来进行此类简单的调试步骤(了解您所遇到的问题所在)。只需将它们放在检查ModelState.isValid的位置的前面/上,然后将鼠标悬停在ModelState上。现在,您可以轻松浏览其中的所有值,看看是什么错误导致isvalid return false。

模型状态


3
是否所有值都可能有0个错误并且modelstate仍然无效?
Omu

如上所述,这是不可能的:)。错误计数一定在某个地方!= 0。
bastijn

2
另外,如果ErrorMessage对您不明确,则可以转到键,它会向您显示它所引用的变量。
发光的

1
在您的视图中,执行:@ Html.HiddenFor(model => model.Username)将解决此问题!
Umit Kaya 2015年

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);可以帮助您
Cirelli94 '18

37

将以下代码粘贴到控制器的ActionResult中,然后将调试器放置在此处。

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

3
最好的答案在这里,应该被评为更高。当我可以从错误中找出错误时,为什么还要花时间在调试器中深入研究ModelState对象的5层。如果我遵循最高评分的答案,我会一整天都在那儿
肖恩·T

2
这是有史以来最好的
玩具

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

或与

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

    }

是否所有值都可能有0个错误并且modelstate仍然无效?
Omu

1
modelstate在字典中将具有键“ Property”和相关的错误。错误消息可能为空,但是错误计数将反映无效的属性计数。因为ModelStateDictionary.AddModelError方法使用一个键,并且使用Exception或error String;需要添加模型错误。
Michael G

13

有时,活页夹将引发异常而没有错误消息。您可以使用以下代码段检索异常,以找出问题所在:

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

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

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

  }

1
这段代码对我非常有帮助,但是重复获取每个.Message的错误(异常)会导致“对象引用未设置为对象的实例”。当我将z.Exception更改为z.ErrorMessage时,我能够显示错误消息。
StackOverflowUser

这是我的解决方案,更改为z.ErrorMessage,尽管我没有遇到z.Exception错误,只是空值。可能值得更新原始答案。
特别是

5

如果删除对ModelsState.IsValid的检查并让它出错,那么如果您复制此行((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors并将其粘贴到Visual Studio的watch部分中,它将提供确切的错误信息。节省大量时间检查错误在哪里。


1
确实有用的提示。
Ash,

这是该线程中的最佳建议。我遇到的问题是一个愚蠢的“。” 用户名中的(点)
mangia

3

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


3

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


1
这发生在我身上。谢谢!
Lewis86 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.