【发布时间】:2010-12-19 23:30:15
【问题描述】:
在哪里可以找到导致 ModelState 无效的错误列表?我没有在 ModelState 对象上看到任何错误属性。
【问题讨论】:
标签: c# asp.net-mvc modelstate
在哪里可以找到导致 ModelState 无效的错误列表?我没有在 ModelState 对象上看到任何错误属性。
【问题讨论】:
标签: c# asp.net-mvc 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))
{
}
【讨论】:
由于您可能正在 Visual Studio 中进行编程,因此您最好利用断点的可能性来进行如此简单的调试步骤(了解您的问题所在)。只需将它们放在您检查 ModelState.isValid 的前面/位置,然后将鼠标悬停在 ModelState 上。现在您可以轻松浏览其中的所有值,看看是什么错误导致 isvalid 返回 false。
【讨论】:
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);可以帮你
关于“可能是 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。
【讨论】:
有时,活页夹会抛出一个没有错误消息的异常。 您可以使用以下 sn-p 检索异常以找出问题所在:
(通常,如果活页夹试图将字符串转换为复杂类型等)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
【讨论】:
就像我刚刚发生的那样 - 当您向模型添加必需的属性而不更新表单时,也会发生这种情况。在这种情况下,ValidationSummary 不会列出错误消息。
【讨论】:
将以下代码粘贴到控制器的 ActionResult 中,并将调试器放在此处。
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();
【讨论】:
ModelState.Where(x => x.Value.Errors.Count > 0).Select(x => new { x.Key, x.Value.Errors })粘贴到您的监视窗口中。无需更改代码或重新编译。
如果您删除对 ModelsState.IsValid 的检查并让它出错,如果您复制此行 ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors 并将其粘贴到 Visual Studio 的 watch 部分,它将准确地告诉您错误是什么。节省大量时间检查错误所在。
【讨论】:
我将一些 JSON 粘贴到 MS Teams Wiki 页面中以供将来参考,当我将其复制回来以供使用时,它添加了额外的不可见字符。我通过在JSONLint linting 确认了这一点
删除多余的字符为我解决了这个错误。
【讨论】: