当 ModelState.IsValid 为 false 时,如何找出 ModelState 中的哪些键包含错误?通常我只需将鼠标悬停在 ModelState.Values 列表上,逐项检查错误计数 > 0。但现在我正在处理一个包含一些复杂对象列表的视图,总共 252 个 ModelState 项目(每个对象的每个项目)每个列表的 ModelState.Keys 上都有一个条目)。
那么,有没有更简单的方法来指出错误源呢?
您可以检查
ViewData.ModelState.Values
集合并查看有哪些错误。
[Httpost]
public ActionResult Create(User model)
{
if(ModelState.IsValid)
{
//Save and redirect
}
else
{
foreach (var modelStateVal in ViewData.ModelState.Values)
{
foreach (var error in modelStateVal.Errors)
{
var errorMessage = error.ErrorMessage;
var exception = error.Exception;
// You may log the errors if you want
}
}
}
return View(model);
}
}
如果您确实想要 Keys(属性名称),您可以迭代
ModelState.Keys
foreach (var modelStateKey in ViewData.ModelState.Keys)
{
var modelStateVal = ViewData.ModelState[modelStateKey];
foreach (var error in modelStateVal.Errors)
{
var key = modelStateKey;
var errorMessage = error.ErrorMessage;
var exception = error.Exception;
// You may log the errors if you want
}
}
ModelState.Values.SelectMany(v => v.Errors);
被认为更干净。
其中 modelState 是 ModelStateDictionary 对象
foreach (var keyModelStatePair in modelState)
{
var key = keyModelStatePair.Key;
var errors = keyModelStatePair.Value.Errors;
if (errors != null && errors.Count > 0)
{
var errorMessages = errors.Select(error =>
{
return error.ErrorMessage;
}).ToArray();
// do something with your keys and errorMessages here
}
}
以下方法给出错误的字典响应可以在
Badrequest
基于功能中返回它。
var ErrorDictionary=ModelState
.Where(x => x.Value.Errors.Count > 0)
.ToList()
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Errors.Select(x => x.ErrorMessage).ToList());
对@cblanto7提供的解决方案进行了一些修改。
_logger.LogInformation("ModelState is not valid: In yourmodelName/yourActionName.");
foreach (var keyModelStatePair in ModelState)
{
var errors = keyModelStatePair.Value.Errors;
if (errors != null && errors.Count > 0)
{
var key = keyModelStatePair.Key;
var errorMessageArray = errors.Select(error =>
{
return error.ErrorMessage;
}).ToArray();
var errorMessages = string.Join(", ", errorMessageArray);
_logger.LogInformation($"ModelState is not valid:{key} has {errorMessages}");
}
}
根据@Upender Reddy的回答,我刚刚得到了这个非常实用的表达式,可以在Watch窗口上用于调试:
ModelState.Where(x => x.Value.Errors.Count > 0)
请注意,
ModelState
来自类型ModelStateDictionary
,它实现了IDictionary<string, ModelState>
接口,因此这意味着可以在其上使用LINQ方法。