ModelState.IsValid == false,为什么?

时间:2009-11-24 17:16:45

标签: asp.net-mvc modelstate

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

9 个答案:

答案 0 :(得分:232)

由于您可能在Visual Studio中进行编程,因此您最好利用断点进行如此简单的调试步骤(了解问题所在的情况)。只需将它们放在前面/位于检查ModelState.isValid并将鼠标悬停在ModelState上的位置即可。现在,您可以轻松浏览内部的所有值,并查看导致isvalid返回false的错误。

modelstate

答案 1 :(得分:39)

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

答案 2 :(得分:21)

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

或以

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

    }

答案 3 :(得分:15)

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

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

答案 4 :(得分:12)

有时绑定器会抛出异常而没有错误消息。 您可以使用以下代码段检索异常,以找出错误的内容:

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

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

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

  }

答案 5 :(得分:3)

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

答案 8 :(得分:0)

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

linting 确认了这一点

删除多余的字符为我修复了这个错误。