[英]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確認了這一點
刪除多余的字符為我修復了這個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.