Vincoli di instradamento
ASP.NET Core, puoi passare variabili sugli URL definendo template di routing, e puoi fornire valori predefiniti, opzionali e vincoli per le variabili.
Il vincolo viene usato aggiungendo il nome specificato del vincolo alla rotta attributi, che viene usata come segue:
Alcuni vincoli sono già previsti all'interno del framework, come segue:
Vincoli | esempio | Esempi di partite | illustrare | int | {id:int} | 123456789, -123456789 | Abbina qualsiasi intero | bool | {active:bool} | vero, FALSO | Corrispondi a veri o falsi (maiuscole distinti) | data | {data di nascita} | 31-12-2016, 31-12-2016 19:32 | Corrisponde ai valori validi di DateTime (in località fissa - vedi avviso) | decimale | {prezzo:decimale} | 49.99, -1,000.01 | Corrisponde ai valori decimali validi (in località fissa - vedi avviso) | Doppio | {peso:doppio} | 1.234, -1.001.01e8 | Corrisponde ai valori doppi validi (in località fissa - vedi avvertimento) | Carro | {peso:galleggiare} | 1.234, -1.001.01e8 | Corrisponde ai valori validi dei float (in località fissa - vedi avvisi) | Guid | {id:guid} | CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638} | Corrisponde ai valori validi del GUID | lunga | {tic:lungo} | 123456789, -123456789 | Corrisponde a valori lunghi validi | minlength(value) | {username:minlength(4)} | Rick | La stringa deve essere composta da almeno 4 caratteri | maxlength(value) | {Nome File:MaxLong(8)} | Richard | Le stringhe non devono superare 8 caratteri | Lunghezza(lunghezza) | {filename:length(12)} | somefile.txt | La stringa deve essere esattamente di 12 caratteri | Lunghezza(min,max) | {filename:length(8,16)} | somefile.txt | La stringa deve essere composta da almeno 8 caratteri e non più di 16 caratteri | min(valore) | {età:min(18)} | 19 | Il valore intero deve essere almeno 18 | max(valore) | {age:max(120)} | 91 | Il valore intero non deve superare 120 | Autonomia (minimo, massimo) | {età:raggio(18,120)} | 91 | Il valore intero deve essere almeno 18 e non superare 120 | Alpha | {name:alpha} | Rick | La stringa deve essere composta da uno o più caratteri alfabetici (a-z, con la distinzione tra maiuscole e minusco). | regex(espressione) | {ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)} | 123-45-6789 | La stringa deve corrispondere all'espressione regolare (vedi consigli per definire le espressioni regolari) | Obbligatorio | {name:required} | Rick | Utilizzato per imporre la presenza di valori non parametrici durante la generazione degli URL |
I vincoli integrati funzionano per la maggior parte dei casi d'uso comuni, ma a volte dobbiamo comunque personalizzare l'effetto desiderato.
Vincoli di routing personalizzati
Un vincolo personalizzato consiste nell'implementare l'interfaccia IRouteConstraint e poi sovraccaricare il metodo Match, che ha quattro parametri.
Il primo parametro, httpContext, è il contesto della richiesta corrente
Il secondo parametro, route, è la route a cui appartiene il vincolo corrente
Il terzo parametro, routeKey, è il nome della variabile attualmente controllata, come id nell'esempio all'inizio dell'articolo Il quarto parametro è il valore del dizionario che corrisponde all'URL corrente, come la rotta dell'esempio all'inizio dell'articolo; se l'URL è user/1, allora esiste un dizionario con chiave = id , valore = 1. Naturalmente, ci sono anche valori per altre variabili, come controller, action, ecc.
Il quinto parametro, routeDirection, è un valore enumerato che rappresenta se l'URL è richiesto dal web o generato da un metodo come Url.Action.
Ad esempio, vogliamo definire un vincolo che specifichi che i parametri passati dalla route devono essere il valore di enumerazione specificato.
Definiamo prima un enum:
Poi definisci i vincoli:
Aggiungi vincoli personalizzati al metodo ConfigureServices in Startup.cs:
Uso dei vincoli sui percorsi:
(WebApplicationTest è lo spazio di nomi attuale)
{id:int:min(2)} deve usare min(2), altrimenti ci sarà un conflitto per id = 0 o id = 1.
Esegui il programma e abbina i nostri vincoli personalizzati quando le rotte sono api/test/0, api/test/1, api/test/true e api/test/false.
Se la route è api/test/{integer maggiore di 2}, abbina la seconda route.
Altri casi corrispondono al terzo percorso.
conclusione
I vincoli di routing sono una caratteristica molto utile in alcuni scenari, che possono ridurre i parametri di controllo nel controller, e la funzione di validazione parziale dei parametri può essere implementata usando l'attuibite dichiarativo, e alcuni duplicati check possono essere estratti in vincoli per uso pubblico.
Il costruttore di vincolo può essere iniettato, quindi può essere molto estensibile, e una verifica dei parametri può essere effettuata interrogando il database.
Il sito ufficiale menziona solo brevemente i vincoli di instradamento, e questo articolo fornisce esempi specifici dell'uso dei vincoli di instradamento.
|