簡體   English   中英

ModelState.IsValid == false,為什么?

[英]ModelState.IsValid == false, why?

我在哪里可以找到使 ModelState 無效的錯誤列表? 我沒有在 ModelState object 上看到任何錯誤屬性。

由於您可能正在 Visual Studio 中進行編程,因此您最好利用使用斷點進行此類簡單調試步驟的可能性(了解您的情況是什么問題)。 只需將它們放在您檢查 ModelState.isValid 的位置的前面 / 並將鼠標懸停在 ModelState 上。 現在您可以輕松瀏覽其中的所有值,並查看導致 isvalid 返回 false 的錯誤。

模型狀態

將以下代碼粘貼到控制器的 ActionResult 中,並將調試器放置在此處。

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

關於“是否有 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。

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

或迭代

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.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.

  }

如果您刪除對 ModelsState.IsValid 的檢查並讓它出錯,如果您復制此行((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors並將其粘貼到 Visual Studio 的 watch 部分,它將給出你到底是什么錯誤。 節省大量時間檢查錯誤所在。

控制器上的 ModelState 屬性實際上是一個 ModelStateDictionary 對象。 您可以遍歷字典上的鍵並使用 IsValidField 方法檢查該特定字段是否有效。

正如我剛剛發生的那樣 - 當您向模型添加必需的屬性而不更新表單時,也會發生這種情況。 在這種情況下,ValidationSummary 不會列出錯誤消息。

我將一些 JSON 粘貼到 MS Teams Wiki 頁面以供將來參考,當我將其復制回來以供使用時,它添加了額外的不可見字符。 我通過JSONLint linting確認了這一點

刪除多余的字符為我修復了這個錯誤。

Visual Studio 2022 + dotnet 6 更新:

我有同樣的問題很長一段時間,終於我找到了。 就我而言,它是 Id 字段:)

只需放置一個斷點並在運行時檢查您的 ModelState 和 go 到本節:

模型狀態 -> 根 -> 子項

你會看到所有有效和無效的鑰匙

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM