Маршрутизация в ASP.NET Core. Ограничения маршрутов

Как правило, ограничения маршрута применяются для решения того, допустимо ли для параметра маршрута значение, выделенное при парсинге из пути. Вернемся к нашему приложению со списком задач и посмотрим, как можно использовать ограничения маршрутов в ASP.NET Core.

Ограничение маршрута

В предыдущей части мы добавили в приложение следующую конечную точку:

    app.MapGet("/{id}/{format=text}", (int id, string format) => {
    ToDoTask task = toDoList.Where(t => t.Id == id).FirstOrDefault();
    StringBuilder sb = new StringBuilder();
    if (task != null)
    {
        if ((string.IsNullOrEmpty(format) == false) && (format.ToLower() == "text"))
        {
            sb.AppendLine($"ID: {task.Id}; Имя: {task.Name} Начало: {task.Start} Окончание: {task.End}");
        }
        else
        {
            sb.AppendLine("<h1>Задача</h1>");
            sb.AppendLine($"<p>ID: {task.Id}</p>");
            sb.AppendLine($"<p>Название: {task.Name}</p>");
            sb.AppendLine($"<p>Начало: {task.Start}</p>");
            sb.AppendLine($"<p>Окончание: {task.End}</p>");
        }
    }
    else
    {
        sb.AppendLine($"Задача с ID {id} не найдена");
    }
    return sb.ToString();
});

в которой определили два параметра — id и format. При этом, мы ожидаем, что в параметре id будет передаваться число. Однако, в адресной строке браузера пользователь имеет возможность задать всё, что угодно и это является для нас проблемой. Так, попробуем задать в качестве параметра id произвольную строку:

Было сгенерировано исключение типа BadHttpRequestException, так как на месте параметра id ожидалось число типа int. Чтобы избавиться от этого исключения мы должны указать ограничение для маршрута. Ограничение маршрута указываются через двоеточие после имени параметра. Применительно к нашему примеру, мы должны указать следующее ограничение:

app.MapGet("/{id:int}/{format=text}", (int id, string format) => {...})

Теперь мы ограничили наш маршрут и указали, что параметр id должен быть именно числом. Теперь, если на место id будет подставлена строка, то такой URL не будет обработан ASP.NET Core.

Список доступных ограничений для маршрута

ASP.NET Core предоставляет достаточно обширный круг возможных ограничений маршрута, каждое из которых в ASP.NET Core соответствует определенному классу:

ограничение Пример Примеры совпадений Примечания. Класс
int {id:int} 123456789, -123456789 Соответствует любому целому числу IntRouteConstraint
bool {active:bool} true, FALSE Соответствует true или false. Без учета регистра BoolRouteConstraint
datetime {dob:datetime} 2016-12-31, 2016-12-31 7:32pm Соответствует допустимому значению DateTime для инвариантного языка и региональных параметров. DateTimeRouteConstraint
decimal {price:decimal} 49.99, -1,000.01 Соответствует допустимому значению decimal для инвариантного языка и региональных параметров. DecimalRouteConstraint
double {weight:double} 1.234, -1,001.01e8 Соответствует допустимому значению double для инвариантного языка и региональных параметров. DoubleRouteConstraint
float {weight:float} 1.234, -1,001.01e8 Соответствует допустимому значению float для инвариантного языка и региональных параметров. FloatRouteConstraint
guid {id:guid} CD2C1638-1638-72D5-1638-DEADBEEF1638 Соответствует допустимому значению Guid GuidRouteConstraint
long {ticks:long} 123456789, -123456789 Соответствует допустимому значению long LongRouteConstraint
minlength(value) {username:minlength(4)} Rick Строка должна содержать не менее 4 символов MinLengthRouteConstraint
maxlength(value) {filename:maxlength(8)} MyFile Строка должна содержать не более 8 символов MaxLengthRouteConstraint
length(length) {filename:length(12)} somefile.txt Длина строки должна составлять ровно 12 символов LengthRouteConstraint
length(min,max) {filename:length(8,16)} somefile.txt Строка должна содержать от 8 до 16 символов LengthRouteConstraint
min(value) {age:min(18)} 19 Целочисленное значение не меньше 18 MinRouteConstraint
max(value) {age:max(120)} 91 Целочисленное значение не больше 120 MaxRouteConstraint
range(min,max) {age:range(18,120)} 91 Целочисленное значение от 18 до 120 RangeRouteConstraint
alpha {name:alpha} John Строка должна состоять из одной буквы или нескольких (az) без учета регистра. AlphaRouteConstraint
regex(expression) {ssn:regex(^\\d{{3}}-\\d{{2}}-\\d{{4}}$)} 123-45-6789 Строка должна соответствовать регулярному выражению. См. советы по определению регулярного выражения. RegexRouteConstraint
required {name:required} John Определяет обязательное наличие значения, не относящегося к параметру, во время формирования URL-адреса RequiredRouteConstraint

Несколько ограничений для одного параметра

Мы можем указывать несколько ограничений для одного параметра. В этом случае, каждой ограничение отделяется от предыдущего двоеточием:

"tasks/{id:int:max(345)}"

здесь мы указываем, что параметр id должен быть числом не более, чем 354.

Итого

Для того, чтобы указать ASP.NET Core, то параметр должен соответствовать какому-то определенному условию, к параметрам маршрута применяются ограничения. Каждое ограничение отделяется от имени параметра (или другого ограничения) символом двоеточия. ASP.NET Core предоставляет нам достаточно обширный перечень ограничений, который мы можем использовать.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии