Ограничения маршрутизации
ASP.NET Core вы можете передавать переменные по URL, определяя шаблоны маршрутизации, а также предоставлять параметры по умолчанию, опции и ограничения для переменных.
Ограничение используется путем добавления указанного имени ограничения к маршруту атрибута, которое используется следующим образом:
Некоторые ограничения уже предусмотрены внутри фреймворка, а именно:
Ограничения | пример | Примеры матчей | иллюстрировать | int | {id:int} | 123456789, -123456789 | Совпадение любого целого числа | буль | {active:bool} | верно, ЛОЖНО | Совпадение с правдивым или ложным (с учетом регистра) | ДатаВремя | {dob:datetime} | 2016-12-31, 2016-12-31 19:32 | Совпадает с действительными значениями DateTime (в фиксированном месте — см. предупреждение) | Десятичная | {цена:десятичная} | 49.99, -1,000.01 | Совпадает с действительными десятичными значениями (в фиксированной локации — см. предупреждение) | Двойной | {вес:двойной} | 1.234, -1,001.01e8 | Совпадает с действительными двойными значениями (в фиксированной локалитетности — см. предупреждение) | Платформа | {вес:плавание} | 1.234, -1,001.01e8 | Совпадает с действительными плавающими значениями (в фиксированной локализации — см. предупреждения) | GUID | {id:guid} | CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638} | Совпадение с действительными значениями GUID | Долго | {тик:лонг} | 123456789, -123456789 | Совпадение с действительными длинными значениями | minlength(значение) | {имя пользователя:minlength(4)} | Рик | Строка должна состоять не менее 4 символов | maxlength(значение) | {имя файла:maxlength(8)} | Ричард | Строки не должны превышать 8 символов | Длина(длина) | {filename:length(12)} | somefile.txt | Строка должна состоять ровно из 12 символов | Длина(min,max) | {имя файла:длина(8,16)} | somefile.txt | Строка должна состоять не менее 8 символов и не более 16 символов | min(value) | {возраст:мин(18)} | 19 | Целое значение должно быть не менее 18 | max(значение) | {возраст:макс(120)} | 91 | Целое значение не должно превышать 120 | Дальность(min,max) | {возраст:диапазон(18,120)} | 91 | Целое значение должно быть не менее 18 и не превышать 120 | альфа | {имя:Альфа} | Рик | Строка должна состоять из одного или нескольких алфавитных символов (a-z, чувствительные к регистру). | Regex(выражение) | {ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)} | 123-45-6789 | Строка должна совпадать с регулярным выражением (см. советы по определению регулярных выражений) | Обязательно | {имя:требуется} | Рик | Используется для обеспечения наличия непараметрических значений при генерации URL |
Встроенные ограничения работают для большинства распространённых случаев использования, но иногда всё равно нужно настраивать нужный эффект.
Пользовательские ограничения маршрутизации
Пользовательское ограничение — реализовать интерфейс IRouteConstraint и затем перегрузить метод Match, который имеет четыре параметра.
Первый параметр, httpContext, — это контекст текущего запроса
Второй параметр, маршрут, — это маршрут, к которому относится текущее ограничение
Третий параметр, routeKey, — это имя переменной, которая сейчас проверяется, например, id в примере в начале статьи Четвёртое значение параметра — это значение словаря, с которым соответствует текущий URL, например, маршрут примера в начале статьи; если URL user/1, то существует словарь с ключом = id , значением = 1. Конечно, есть и значения для других переменных, таких как контроллер, действие и т.д.
Пятый параметр, routeDirection, — это перечисленное значение, которое обозначает, запрашивается ли URL вебом или генерируется методом, таким как Url.Action.
Например, мы хотим определить ограничение, которое указывает, что параметры, передаваемые маршрутом, должны быть указанным значением перечисления.
Давайте сначала определим энум:
Затем определите ограничения:
Добавьте пользовательские ограничения в метод ConfigureServices в Startup.cs:
Использование ограничений на маршрутах:
(WebApplicationTest — текущее пространство имён)
{id:int:min(2)} маршрут должен использовать min(2), иначе возникнет конфликт для id = 0 или id = 1.
Запустите программу и сопоставьте наши пользовательские ограничения, когда маршруты — api/test/0, api/test/1, api/test/true и api/test/false.
Если маршрут api/test/{целое число больше 2}, сопоставьте второй маршрут.
Другие случаи совпадают с третьим путём.
заключение
Ограничения маршрутизации — очень полезная функция в некоторых случаях, которая может уменьшить параметры проверки в контроллере, а функция частичной валидации параметров может быть реализована с помощью декларативного attruibute, а некоторые дублирующие проверки могут быть извлечены в ограничения для публичного использования.
Конструктор ограничения может быть внедрён, что позволяет его очень расширять, а некоторую проверку параметров можно выполнить с помощью запроса к базе данных.
Официальный сайт лишь кратко упоминает ограничения маршрутизации, а в этой статье приводятся конкретные примеры их применения.
|