【问题标题】:ModelState.IsValid == false, why?ModelState.IsValid == false,为什么?
【发布时间】:2010-12-19 23:30:15
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net-mvc modelstate


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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仍然无效?
      • modelstate 将在字典中有一个键“Property”和一个相关的错误。错误消息可能为空白,但错误计数将反映无效的属性计数。因为ModelStateDictionary.AddModelError方法需要一个key,还有Exception或者error String;需要添加模型错误。
      【解决方案3】:

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

      【讨论】:

      • 会不会所有的值都有0个错误,modelstate仍然无效?
      • 如上所述,不,这是不可能的:)。某处必须是错误计数!=0。
      • 作为附加,如果 ErrorMessage 对您来说不明确,您可以转到键,它会显示它所指的变量。
      • 在您的视图中,执行:@Html.HiddenFor(model => model.Username) 将解决问题!
      • var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);可以帮你
      【解决方案4】:

      关于“可能是 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) 有问题吗?
      • 注意error可以是Message或者Exception;例如 Html.ValidationSummary 不显示异常(我猜出于安全原因);也许这就是你看不到错误的原因?你如何检查没有错误?
      • ModelState.IsValid 给出错误
      • 哈哈,这很明显......你如何检查“值有 0 个错误”?
      【解决方案5】:

      有时,活页夹会抛出一个没有错误消息的异常。 您可以使用以下 sn-p 检索异常以找出问题所在:

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

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

      【讨论】:

      • 这段代码对我很有帮助,但是迭代错误(异常)以获取每个 .Message 导致“对象引用未设置为对象的实例”。当我将 z.Exception 更改为 z.ErrorMessage 时,我能够显示错误消息。
      • 这是我的解决方案,改为 z.ErrorMessage,虽然我没有收到 z.Exception 错误,只是空值。可能值得更新原始答案。
      【解决方案6】:

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

      【讨论】:

      • 这发生在我身上。谢谢小费!
      【解决方案7】:

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

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

      【讨论】:

      • 最佳答案在这里,应该被评为更高。当我可以从中找出错误时,为什么还要花时间在调试器中挖掘 ModelState 对象的 5 层。如果我遵循评分最高的答案,我会整个早上都在那儿
      • 这是有史以来最好的
      • 或者在调试时将ModelState.Where(x => x.Value.Errors.Count > 0).Select(x => new { x.Key, x.Value.Errors })粘贴到您的监视窗口中。无需更改代码或重新编译。
      • 这应该是答案。它解决了 OP 希望查看错误列表的问题。我就是这么读的。
      【解决方案8】:

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

      【讨论】:

      • 非常有用的提示。
      • 这是本主题中最好的建议。我遇到的问题是一个愚蠢的“。” (点)在用户名中
      【解决方案9】:

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

      删除多余的字符为我解决了这个错误。

      【讨论】:

        猜你喜欢
        • 2012-05-20
        • 2019-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 2013-09-08
        • 2018-02-16
        相关资源
        最近更新 更多