ModelState.IsValid == false,为什么?

Omu*_*Omu 109 c# asp.net-mvc modelstate

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

bas*_*ijn 245

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

的ModelState

  • 是否可能所有值都有0个错误且模型状态仍然无效? (3认同)
  • 如上所述,不,这是不可能的:)。某个地方一定有错误计数!=0。 (2认同)
  • 作为补充,如果ErrorMessage对你不明确,你可以转到键,它会显示它所指的变量. (2认同)
  • 在您的视图中,执行: @Html.HiddenFor(model => model.Username) 将解决问题! (2认同)
  • `var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);` 可以帮助你 (2认同)

que*_*en3 43

关于"可以是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,它看起来不可能.那就是ASP.NET MVC v1.


Kri*_*hna 23

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

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

  • 或者在调试时将“ModelState.Where(x => x.Value.Errors.Count > 0).Select(x => new { x.Key, x.Value.Errors })”粘贴到 Watch 窗口中。无需更改代码或重新编译。 (5认同)
  • 这是有史以来最好的 (3认同)
  • 最好的答案在这里,应该被评为更高。当我可以从错误中找出错误时,为什么还要花时间在调试器中深入研究ModelState对象的5层。如果我遵循最高评分的答案,我会整天都在那里 (2认同)

Mic*_*l G 22

bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);
Run Code Online (Sandbox Code Playgroud)

或者迭代

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

    }
Run Code Online (Sandbox Code Playgroud)


Jon*_*ved 13

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

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

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

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

  }
Run Code Online (Sandbox Code Playgroud)


Tom*_*ugh 5

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