【发布时间】: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 继续将它们指示为可移动的。我将在相关网站上打开一个错误。
谢谢
对我的问题投反对票的人的更新
【问题讨论】:
标签: c# asp.net-core razor .net-5 rider