Обмеження маршрутизації
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 | Збігається з дійсними значеннями float (у фіксованій локації — див. попередження) | GUID | {id:guid} | CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638} | Збігається з дійсними значеннями GUID | довгий | {цокає:довго} | 123456789, -123456789 | Відповідність дійсним довгим значенням | minlength(значення) | {ім'я користувача:minlength(4)} | Рік | Рядок має складатися щонайменше з 4 символів | maxlength(значення) | {ім'я файлу:maxlength(8)} | Річард | Рядки не повинні перевищувати 8 символів | Довжина(довжина) | {ім'я файлу:довжина(12)} | somefile.txt | Рядок має складатися точно з 12 символів | Довжина(min,max) | {ім'я файлу:довжина(8,16)} | somefile.txt | Рядок повинен складатися щонайменше з 8 символів і не більше 16 символів | min(значення) | {вік:min(18)} | 19 | Ціле значення має бути не менше 18 | max(значення) | {вік:макс(120)} | 91 | Ціле значення не повинно перевищувати 120 | Дальність(мінімум,максимум) | {вік:діапазон(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, а деякі дублікатні перевірки можна витягти у обмеження для публічного використання.
Конструктор обмеження можна впровадити, тож він може бути дуже розширюваним, а також деяку перевірку параметрів можна здійснити шляхом запиту до бази даних.
Офіційний вебсайт лише коротко згадує обмеження маршрутизації, а ця стаття наводить конкретні приклади їх використання.
|