繁体   English   中英

为什么 Aspnet.Core model 验证不会在 Nullable 属性上引发异常?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM