Restrições de roteamento
ASP.NET Core, você pode passar variáveis em URLs definindo templates de roteamento, além de fornecer padrão, opcionais e restrições para variáveis.
A restrição é usada adicionando o nome especificado da restrição à rota do atributo, que é usada da seguinte forma:
Algumas restrições já são fornecidas dentro do framework, conforme segue:
Restrições | exemplo | Exemplos de partidas | ilustrar | int | {id:int} | 123456789, -123456789 | Corresponda a qualquer inteiro | bool | {active:bool} | verdade, FALSO | Corresponder verdadeiro ou falso (distinção de maiúsculas e minúsculas) | Data-hora | {data de nascimento:data} | 31-12-2016, 31-12-2016 19:32 | Corresponde a valores válidos de DateTime (em localidade fixa - veja aviso) | Decimal | {preço:decimal} | 49.99, -1,000.01 | Corresponde a valores decimais válidos (em localidade fixa - veja aviso) | duplo | {peso:dobro} | 1.234, -1.001.01e8 | Corresponde a valores duplos válidos (em localidade fixa - veja aviso) | Flutuador | {peso:flutuação} | 1.234, -1.001.01e8 | Corresponde a valores válidos de float (em localidade fixa - veja avisos) | Guid | {id:guid} | CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638} | Corresponde a valores válidos do GUID | Longas | {tic:long} | 123456789, -123456789 | Corresponde a valores longos válidos | minlength(value) | {nome de usuário:minlength(4)} | Rick | A string deve ter pelo menos 4 caracteres | maxlength(valor) | {nome do arquivo:maxlength(8)} | Richard | As strings não devem exceder 8 caracteres | comprimento(comprimento) | {nomedo do arquivo:comprimento(12)} | somefile.txt | A sequência deve ter exatamente 12 caracteres | Comprimento(min,max) | {nomedo do arquivo:comprimento(8,16)} | somefile.txt | A sequência deve ter pelo menos 8 caracteres e no máximo 16 caracteres | min(valor) | {idade:min(18)} | 19 | O valor inteiro deve ser pelo menos 18 | max(valor) | {idade:max(120)} | 91 | O valor inteiro não deve exceder 120 | Alcance (mínimo, máximo) | {idade:variedade(18,120)} | 91 | O valor inteiro deve ser pelo menos 18 e não exceder 120 | Alpha | {nome:alpha} | Rick | A sequência deve ser composta por um ou mais caracteres alfabéticos (de a a z, com diferenciação de maiúsculas e maiúsculas). | regex(expressão) | {ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)} | 123-45-6789 | A string deve corresponder à expressão regular (veja dicas para definir expressões regulares) | Necessário | {nome:obrigatório} | Rick | Usado para impor a presença de valores não paramétricos durante a geração de URL |
As restrições embutidas funcionam para a maioria dos casos de uso comuns, mas às vezes ainda precisamos personalizar o efeito que queremos.
Restrições de roteamento personalizadas
Uma restrição personalizada é implementar a interface IRouteConstraint e então sobrecarregar o método Match, que possui quatro parâmetros.
O primeiro parâmetro, httpContext, é o contexto da solicitação atual
O segundo parâmetro, rota, é a rota à qual pertence a restrição atual
O terceiro parâmetro, routeKey, é o nome da variável atualmente verificada, como id no exemplo no início do artigo Os valores do quarto parâmetro são os valores do dicionário que a URL atual corresponde, como a rota do exemplo no início do artigo; se a URL for users/1, então existe um dicionário com chave = id , valor = 1. Claro, também existem valores para outras variáveis, como controlador, ação, etc.
O quinto parâmetro, routeDirection, é um valor enumerado que representa se a URL é solicitada pela web ou gerada por um método como Url.Action.
Por exemplo, queremos definir uma restrição que especifique que os parâmetros passados pela rota devem ser o valor especificado da enumeração.
Vamos definir um enum primeiro:
Então defina as restrições:
Adicione restrições personalizadas ao método ConfigureServices em Startup.cs:
Uso de restrições nas rotas:
(WebApplicationTest é o namespace atual)
{id:int:min(2)} rota deve usar min(2), caso contrário haverá um conflito para id = 0 ou id = 1.
Execute o programa e combine nossas restrições personalizadas quando as rotas são api/test/0, api/test/1, api/test/true e api/test/false.
Se a rota for api/test/{inteiro maior que 2}, corresponda à segunda rota.
Outros casos correspondem à terceira rota.
conclusão
Restrições de roteamento são um recurso muito útil em alguns cenários, que podem reduzir os parâmetros de verificação no controlador, e a função de validação parcial de parâmetros pode ser implementada usando attruibute declarativo, e algumas verificações duplicadas podem ser extraídas em restrições para uso público.
O construtor de restrição pode ser injetado, então pode ser muito extensível, e alguma verificação de parâmetros pode ser feita consultando o banco de dados.
O site oficial menciona brevemente as restrições de roteamento, e este artigo fornece exemplos específicos do uso de restrições de roteamento.
|