Содержание
Как правило, ограничения маршрута применяются для решения того, допустимо ли для параметра маршрута значение, выделенное при парсинге из пути. Вернемся к нашему приложению со списком задач и посмотрим, как можно использовать ограничения маршрутов в 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 |
Long |
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 | Строка должна состоять из одной буквы или нескольких (a —z ) без учета регистра. |
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 предоставляет нам достаточно обширный перечень ограничений, который мы можем использовать.