c# RazorPages ModelState Errors 属性为空并导致异常

Posted

技术标签:

【中文标题】c# RazorPages ModelState Errors 属性为空并导致异常【英文标题】:c# RazorPages ModelState Errors property is null and causes Exception 【发布时间】:2021-10-01 15:13:03 【问题描述】:

我有一个 RazorPage 应用程序,在 _layout.cshtml 文件中我有以下代码 sn-p:

@if (ViewData.ModelState[""].Errors.Count > 0)

    <div class="alert alert-error">
       <button type="button" class="close" data-dismiss="alert">×</button>
       @Html.ValidationSummary(true, "Errors: ")
    </div>

在 Microsoft 源代码中浏览似乎 Errors 属性永远不应为 null,但实际上并非如此,事实上有时此属性为 null,因此没有条件访问?关于这样的错误:

@if (ViewData.ModelState[""].Errors?.Count > 0)

在某些情况下,它可能会导致 NullReferenceException。我的代码中有错误吗? Errors 属性只是没有设置:

所以即使我想要我也无法将其设置为 null。为什么会发生这种情况? 我只是无法向自己解释这一点。 谢谢

更新

再次挖掘调试这段代码,发现键为“”的ModelStateEntry为空

 (ViewData.ModelState[""]) is null

如果错误是由 IdentityServer 中间件而不是我的页面引发的,我只是使用空字符串作为键。其实从 Asp.Net Core 源码我们有:

public ModelStateEntry this[string key]

    get
    
        if (key == null)
        
            throw new ArgumentNullException(nameof(key));
        

        TryGetValue(key, out var entry);
        return entry!;
    


public bool TryGetValue(string key, [NotNullWhen(true)] out ModelStateEntry? value)

    if (key == null)
    
        throw new ArgumentNullException(nameof(key));
    

    var result = GetNode(key);
    if (result?.IsContainerNode == false)
    
        value = result;
        return true;
    

    value = null; // Retunr null if key not found
    return false;

在这种情况下,我会期望加上一个 KeyNotFoundException。

无论如何感谢您的帮助。

解决方案

最后,因为在页面出现错误的情况下,我想在相关弹出窗口中显示这些类型的错误,而在其他情况下,我只想显示在不同页面中呈现的 IdentityServer 的错误消息和使用 IS4 ErrorMessage 对象,我只是简单地插入了两个条件访问,如下所示:

唯一的“问题”是 ide Rider 继续将它们指示为可移动的。我将在相关网站上打开一个错误。

谢谢

对我的问题投反对票的人的更新

https://youtrack.jetbrains.com/issue/RSRP-486576

【问题讨论】:

【参考方案1】:

如果要获取所有错误的数量,请尝试使用:

ViewData.ModelState.Where(n => n.Value.Errors.Count > 0).ToList().Count()

如果您想获取某个属性的所有错误,请尝试使用:

ModelState.Keys.Where(k => k == "Name")
     .Select(k => ModelState[k].Errors).First().Select(e => e.ErrorMessage)

【讨论】:

以上是关于c# RazorPages ModelState Errors 属性为空并导致异常的主要内容,如果未能解决你的问题,请参考以下文章

c# -ModelState.IsValid 仅在资源语言更改时返回 false?

将 ModelState 转换为 JSON 以进行日志记录

基于modelState的信息验证

无法使用 SetModelValue 修改 ModelState

我如何只能使用 ModelState.IsValid 检查一个模型

如何在 UseExceptionHandler 中访问 ModelState