Ограничения за маршрутизиране
ASP.NET Core можете да предавате променливи върху URL адреси, като дефинирате шаблони за маршрутизиране, както и да предоставяте стандарти, опционални и ограничения за променливите.
Ограничението се използва чрез добавяне на зададеното име на ограничение към маршрута на атрибута, което се използва по следния начин:
Някои ограничения вече са предоставени в рамките на рамката, както следва:
Ограничения | пример | Примери за съвпадения | илюстрирам | int | {id:int} | 123456789, -123456789 | Съвпадение на всяко цяло число | bool | {active:bool} | вярно, НЕВЯРНО | Съвпадение на вярно или невярно (чувствително от регистри) | Datetime | {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(стойност) | {filename:maxlength(8)} | Ричард | Низовете не трябва да надвишават 8 знака | Дължина(дължина) | {filename:length(12)} | somefile.txt | Низът трябва да е точно 12 знака | Дължина(min,max) | {filename:length(8,16)} | somefile.txt | Низът трябва да има поне 8 знака и не повече от 16 знака | min(стойност) | {възраст:мин(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 адресът е users/1, тогава има речник с ключ = id , стойност = 1. Разбира се, има и стойности за други променливи, като controller, action и др.
Петият параметър, 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/{integer по-голямо от 2}, съпоставете втория маршрут.
Други случаи са свързани с третия път.
извод
Ограниченията за маршрутизиране са много полезна функция в някои сценарии, които могат да намалят параметрите за проверка в контролера, а функцията на валидиране на частични параметри може да се реализира чрез декларативен атруибут, а някои дублиращи проверки могат да бъдат извлечени в ограничения за публична употреба.
Конструкторът на ограничението може да бъде инжектиран, така че може да бъде много разшириваем, а известна проверка на параметрите може да се извърши чрез заявка към базата данни.
Официалният уебсайт споменава ограниченията за маршрутизиране само накратко, а тази статия предоставя конкретни примери за използването на маршрутизиращи ограничения.
|