Почему проверка сложных объектов работает так, а простые параметры - нет? - PullRequest
1 голос
/ 10 января 2020

В контроллере основного приложения ASP. NET, который был украшен атрибутом [ApiController], если мы передали пустой объект JSON для конечной точки, которая ожидает следующий объект (из тела запроса, по умолчанию):

public class ComplexObject
{
    [Range(1, int.MaxValue, ErrorMessage = "Prop1 must contain a positive number.")]
    public int Prop1 { get; set; }

    [Range(1, int.MaxValue, ErrorMessage = "Prop2 must contain a positive number.")]
    public int Prop2 { get; set; }
}

проверка не проходит должным образом (свойства имеют тип int, им назначено значение по умолчанию для этого типа, равное 0, что не проходит проверку проверки.

Но , если у нас есть конечная точка, которая не принимает сложный объект (из тела), а две переменные типа int из URI, если пользователь просто нажимает конечную точку без строки запроса ( Параметры URI), проверка, по-видимому, проходит, хотя обоим свойствам при отладке присваивается значение 0.

Что отличается в этом случае, когда проверка проходит скорее, чем не проходит? Вот как я оформлены атрибуты для параметров URI:

public IActionResult SomeAction([Range(1, int.MaxValue, ErrorMessage = "Prop1 must contain a positive number.")] int prop1,
            [Range(1, int.MaxValue, ErrorMessage = "Prop2 must contain a positive number.")] int prop2)
{
   ...
}

Очевидно, что если я также добавлю атрибут [Required], все будет работать как exp ected. Но тогда почему SomeObject работает без атрибута [Required]? [Range] там в основном убивают двух зайцев одним выстрелом!

public IActionResult SomeAction([Required][Range(1, int.MaxValue, ErrorMessage = "Prop1 must contain a positive number.")] int prop1,
            [Required][Range(1, int.MaxValue, ErrorMessage = "Prop2 must contain a positive number.")] int prop2)
{
   ...
}

1 Ответ

2 голосов
/ 10 января 2020

Параметры действий являются необязательными, и они проверяются только при их наличии. Таким образом, если вы не передадите один из них, проверка Range не будет применена. Когда вы публикуете весь объект, вы выполняете это первое условие: параметр имеет значение. Поэтому проверка будет продолжена для этого объекта, а затем и для всех свойств, которые он содержит.

Затем, поскольку ваши свойства не являются целочисленными значениями, если вы не передадите значение, тогда они по умолчанию будут равны нулю. Ноль находится за пределами допустимого диапазона, поэтому проверка не пройдена. На самом деле здесь не применяется обязательная проверка. Вы просто используете тот факт, что значение по умолчанию неприемлемо для следующего этапа проверки.

...