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?
无法使用 SetModelValue 修改 ModelState