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返回错误的错误。
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将不会列出错误消息。