ASP.Net Core:如何获取无效 ModelState 值的键?

Posted

技术标签:

【中文标题】ASP.Net Core:如何获取无效 ModelState 值的键?【英文标题】:ASP.Net Core: How do you get the key of an invalid ModelState value? 【发布时间】:2021-11-09 02:12:52 【问题描述】:

我的 .Net 5./ASP.Net MVC 应用程序中有一个“编辑”页面。如果ModelState.IsValid 为“false”,我想在拒绝整个页面之前检查各个错误。

问题:如何获取ModelState 列表中无效项目的“名称”?

例如:

处理方法:public async Task<IActionResult> OnPostAsync()

if (!ModelState.IsValid):“假”

this.ModelState.Values[0]: SubKey=ID, Key="ID", ValidationState=Invalid Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateEntry Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ModelStateNode

代码:

foreach (ModelStateEntry item in ModelState.Values)

    if (item.ValidationState == ModelValidationState.Invalid)
    
        // I want to take some action if the invalid entry contains the string "ID"
        var name = item.Key;  // CS1061: 'ModelStateEntry 'does not contain a definition for 'Key'
        ...

问题:如何从每个无效的 ModelState“值”项中读取“键”???


分辨率

我的基本问题是遍历“ModelState.Values”。相反,我需要遍历“ModelState.Keys”以获得所有必需的信息。

解决方案 1)

foreach (KeyValuePair<string, ModelStateEntry> modelStateDD in ModelState) 

    string key = modelStateDD.Key;
    ModelStateEntry item = ModelState[key];
    if (item.ValidationState == ModelValidationState.Invalid) 
        // Take some action, depending on the key
        if (key.Contains("ID"))
           ...

解决方案 2)

var errors = ModelState
               .Where(x => x.Value.Errors.Count > 0)
               .Select(x => new  x.Key, x.Value.Errors )
               .ToList();
foreach (var error in errors) 
    if (error.Key.Contains("ID"))
       continue;
    else if (error.Key.Contains("Foo"))
      ...

非常感谢 devlin carnate 为我指明了正确的方向,并感谢 PippoZucca 提供了一个很好的解决方案!

【问题讨论】:

this thread 中选择的答案是否回答了您的问题? (也可以查看所选答案的 cmets,因为有人说明了如何获得“密钥”) @devlin carnate:感谢您的回复。我查看了该链接中的解决方案。不幸的是,他们检索的唯一内容是错误消息。我想知道导致错误的模型对象的名称。那是我还没有弄清楚的部分。 这能回答你的问题吗? How to get all Errors from ASP.Net MVC modelState? @FoggyDay :所以您尝试了评论中的解决方案?由“viggity”发表的评论。它特别声明它按键显示错误... 【参考方案1】:

调试时,您可以输入:

ModelState.Where(
  x => x.Value.Errors.Count > 0
).Select(
  x => new  x.Key, x.Value.Errors 
)

进入您的观察窗口。 这将收集所有生成错误的密钥以及错误描述。

【讨论】:

太棒了——正是我想要的。它结合了“Key”和“Error”,这样我就可以通过字段名称检查每个模型错误。完美 - 谢谢!

以上是关于ASP.Net Core:如何获取无效 ModelState 值的键?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 Asp.NET Core 中销毁/无效 JWT 令牌吗?

ASP.Net Core 3 远程证书在 MacOs 上无效

ASP.Net Core 如何设置输入值

ASP.NET Core 标识 - 无效令牌 (Linux)

asp.net web.Config 配置httpHandlers无效 求解,在线等!

ASP.NET CORE Identity DataProtectionTokenProviderOptions 密码重置令牌无效