如何找出ModelState的哪个key有错误

问题描述 投票:0回答:7

当 ModelState.IsValid 为 false 时,如何找出 ModelState 中的哪些键包含错误?通常我只需将鼠标悬停在 ModelState.Values 列表上,逐项检查错误计数 > 0。但现在我正在处理一个包含一些复杂对象列表的视图,总共 252 个 ModelState 项目(每个对象的每个项目)每个列表的 ModelState.Keys 上都有一个条目)。

那么,有没有更简单的方法来指出错误源呢?

c# asp.net-mvc modelstate
7个回答
37
投票

您可以检查

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
    }
}

3
投票
ModelState.Values.SelectMany(v => v.Errors);

被认为更干净。


1
投票

其中 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
        }
    }

1
投票

同样的问题我也困扰了很久,终于找到了。就我而言,它是 Id 字段:)

只需放置一个断点并在运行时检查您的 ModelState 并转到此部分:

模型状态 -> 根 -> 子项

您将看到所有有效和无效的密钥


1
投票

以下方法给出错误的字典响应可以在

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());

0
投票

对@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}");
            
        }
    }

0
投票

根据@Upender Reddy的回答,我刚刚得到了这个非常实用的表达式,可以在Watch窗口上用于调试:

ModelState.Where(x => x.Value.Errors.Count > 0)

请注意,

ModelState
来自类型
ModelStateDictionary
,它实现了
IDictionary<string, ModelState>
接口,因此这意味着可以在其上使用LINQ方法。

© www.soinside.com 2019 - 2024. All rights reserved.