Почему при проверке модели Aspnet.Core исключение не допускается для свойств Nullable? - PullRequest
0 голосов
/ 07 ноября 2019

Следующий код в C # вызовет исключение InvalidOperationException, поскольку ему не разрешен доступ к значению, если оно не установлено.

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();
}

Когда происходит проверка модели, фреймворк просто выдает исключение, потому что пытается прочитать все свойства MyStruct и, очевидно, не может прочитать Value. Но если у меня есть только пустое поле, проверка работает просто отлично, даже если Value также выдает исключение.

Есть ли какая-то магия, которая просто жестко запрограммирована, чтобы не делать это для Nullable, или есть какой-то способ, которым яможет иметь такое же поведение в моем коде? Т.е. я хочу, чтобы проверка не вызвала исключение для моего класса.

У меня есть подозрение, что это либо жестко закодированная проверка, либо какой-то синтаксический сахар, который позволяет Nullable struct присваивать и сравнивать со значением null. .

1 Ответ

1 голос
/ 07 ноября 2019

Если вы посмотрите на источник ссылки для 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> правила немного отличаются в том, как работают его свойства.

Свойства типа Nullable<T> работают, даже если экземпляр имеет значение null, что обычно вызывает другие типы.

int? val = null;
Console.WriteLine(val.HasValue); // No NullReferenceException
Console.WriteLine(val == null); // True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...