[英]Why does not Aspnet.Core model validation throw an exception on Nullable properties?
C# 中的以下代码将抛出 InvalidOperationException,因为它在未设置时不允许访问 Value。
int? a = null;
Console.Writeline(a.Value);
我在 AspNet.Core 中有以下代码:
public class Request
{
[Range(10, 20]
public int? Field1 {get; set;}
[Range(10, 20]
public MyStruct Field2 {get; set;}
}
public struct MyStruct
{
public int Value => throw new Exception();
}
当 model 验证发生时,框架只是抛出一个异常,因为它试图读取MyStruct
的所有属性并且它显然无法读取Value
。 但是,如果我只有可为空的字段,则验证工作得很好,即使那里的Value
也会引发异常。
是否有一些魔法只是硬编码不能为可空做,或者有什么方法可以在我的代码中具有相同的行为? 即我希望验证不会为我的 class 抛出异常。
我怀疑这要么是硬编码检查,要么是某种语法糖,使Nullable
结构可以分配并与 null 进行比较。
如果您查看 RangeAttribute 的参考源,您会在IsValid
方法的开头看到:
// Automatically pass if value is null or empty. RequiredAttribute should be used to assert a value is not empty.
if (value == null) {
return true;
}
所以这是设计使然。 正如评论所暗示的,如果您有一个可为空的类型并且想要确认有一个值,您应该使用RequiredAttribute。
public class Request
{
[Required]
[Range(10, 20]
public int? Field1 {get; set;}
[Range(10, 20]
public MyStruct Field2 {get; set;}
}
使用Nullable<T>
,其属性的工作方式会有所不同。
即使实例是 null, Nullable<T>
类型上的属性也有效,这通常会在其他类型上抛出。
int? val = null;
Console.WriteLine(val.HasValue); // No NullReferenceException
Console.WriteLine(val == null); // True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.