C# ModelState.IsValid==false,为什么?

C# ModelState.IsValid==false,为什么?,c#,asp.net-mvc,modelstate,C#,Asp.net Mvc,Modelstate,在哪里可以找到使ModelState无效的错误列表?我在ModelState对象上没有看到任何错误属性 控制器上的ModelState属性实际上是一个ModelStateDictionary对象。您可以迭代字典上的键,并使用IsValidField方法检查特定字段是否有效 bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count > 1); 或者用 foreach (ModelState sta

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

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

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

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

    }

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

关于“是否可能是0个错误且IsValid==false”:以下是来自


现在看来不可能了。嗯,这是针对ASP.NET MVC v1的。

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

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


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

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

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


如果删除对ModelsState.IsValid的检查并让它出错,如果复制此行
((System.Data.Entity.Validation.DbEntityValidationException)$exception)。EntityValidationErrors
,并将其粘贴到Visual Studio的“监视”部分,则会准确显示错误内容。检查错误位置可节省大量时间。

是否可能所有值都有0个错误,并且modelstate仍然无效?如上所述,否这是不可能的:)。一定有什么地方出错了=0.作为一个附加组件,如果ErrorMessage对您不明确,您可以转到键,它将显示它引用的变量。在您的视图中,do:@Html.HiddenFor(model=>model.Username)将解决此问题
var asdf=ModelState.Values.Where(v=>v.Errors.Count>0)
可以帮助您所有值是否都有0个错误而modelstate仍然无效?modelstate将在字典中有一个键“Property”和一个关联的错误。错误消息可以为空,但错误计数将反映无效的属性计数。因为ModelStateDictionary.AddModelError方法接受键、异常或错误字符串;需要添加一个模型错误。在我看来,不应该这样做,是不是值有问题。All(modelState=>modelState.Errors.Count==0)?请注意,错误可以是消息或异常;例如,Html.ValidationSummary不显示异常(我想是出于安全原因);也许这就是为什么你看不到错误?如何检查无错误?ModelState.IsValid给出了falseHa-ha,这很明显。。。如何检查“值有0个错误”?此代码对我很有帮助,但通过迭代错误(异常)来获取每个错误。消息导致“对象引用未设置为对象的实例”。当我将z.Exception更改为z.ErrorMessage时,我能够显示错误消息。这是我的解决方案,更改为z.ErrorMessage,虽然我没有得到z.Exception的错误,只是空值。可能值得更新原始答案。这发生在我身上。谢谢你的提示!非常有用的提示。这是本帖中最好的建议。我遇到的问题是用户名中的一个愚蠢的“.”(点)。这里的最佳答案应该更高。既然我可以从调试器中找出错误,为什么还要花时间在5层ModelState对象中挖掘呢。如果我遵循评分最高的答案,我整个上午都会在那里。这是最好的everOr,或者在调试时将
ModelState.Where(x=>x.Value.Errors.Count>0)粘贴到您的手表窗口中。无需更改代码或重新编译。
 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

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

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