Programmering

Sådan oprettes rutebegrænsninger i ASP.NET Core

Rutebegrænsninger i ASP.NET Core bruges til at filtrere eller begrænse uønskede data i at nå dine controllerhandlinger. For en primer om routing i ASP.NET Core kan du henvise til min tidligere artikel om attributbaseret routing versus convention-baseret routing i ASP.NET Core. Denne artikel går ud over det grundlæggende for at udforske de avancerede operationer ved hjælp af rutebegrænsninger.

For at arbejde med kodeeksemplerne i denne artikel skal du have Visual Studio 2019 installeret i dit system. Hvis du ikke allerede har en kopi, kan du downloade Visual Studio 2019 her.

Opret et ASP.NET Core MVC-projekt i Visual Studio 2019

Lad os først starte med at oprette et ASP.Net Core-projekt i Visual Studio 2019. Forudsat at Visual Studio 2019 er installeret i dit system, skal du følge trinene beskrevet nedenfor for at oprette et nyt ASP.Net Core-projekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klik på "Opret nyt projekt."
  3. I vinduet "Opret nyt projekt" skal du vælge "ASP.NET Core Web Application" fra listen over skabeloner, der vises.
  4. Klik på Næste.
  5. I vinduet "Konfigurer dit nye projekt" skal du angive navnet og placeringen for det nye projekt.
  6. Marker afkrydsningsfeltet "Placer løsning og projekt i samme bibliotek" afhængigt af dine præferencer.
  7. Klik på Opret.
  8. I vinduet "Opret en ny ASP.NET Core-webapplikation", der vises derefter, skal du vælge .NET Core som runtime og ASP.NET Core 3.1 (eller senere) fra rullelisten øverst.
  9. Vælg "Webapplikation (Model-View-Controller)" som projektskabelon for at oprette et nyt ASP.NET Core MVC-program.
  10. Sørg for, at afkrydsningsfelterne "Aktivér Docker-support" og "Konfigurer til HTTPS" ikke er markeret, da vi ikke bruger disse funktioner her.
  11. Sørg for, at godkendelse er indstillet til "Ingen godkendelse", da vi heller ikke bruger godkendelse.
  12. Klik på Opret.

Ved at følge disse trin oprettes et nyt ASP.NET Core MVC-projekt i Visual Studio 2019. Vi bruger dette projekt i afsnittene nedenfor for at illustrere, hvordan vi kan bruge rutebegrænsninger i ASP.NET Core 3.1.

RouteCollection-klassen i ASP.NET Core

Klassen RouteTable i ASP.NET Core indeholder en egenskab ved navn Routes, der gemmer alle ruter som RouteCollection. Klassen RouteCollection indeholder nogle udvidelsesmetoder, der kan bruges til at kortlægge ruter eller ignorere dem.

MapRoute er en overbelastet metode, der accepterer begrænsninger som en parameter. Du kan bruge dette til at overføre din begrænsning til ruten. Følgende er erklæringen af ​​MapRoute-metoden.

offentlig statisk rutekortRute (denne ruteindsamlingsrute, strengnavn,

streng url, objektstandarder, objektbegrænsninger);

IRouteConstraint-grænsefladen i ASP.NET Core

IRouteConstraint-grænsefladen er en kontrakt, der kun indeholder erklæringen om en metode ved navn Match. Denne grænseflade skal udvides med en klasse, og Match-metoden implementeres i den for at kontrollere, om en bestemt URL-parameter er gyldig for en begrænsning. Sådan defineres IRouteConstraint-grænsefladen:

navneområde Microsoft.AspNetCore.Routing

{

offentlig grænseflade IRouteConstraint

    {

bool Match (

HttpContext httpContext,

IRouter rute,

streng ruteKey,

RouteValueDictionary-værdier,

RouteDirection routeDirection);

    }

}

ConstraintMap-ordbogen i ASP.NET Core

Et ConstraintMap er en ordbog, der indeholder en liste over rutebegrænsninger, der kortlægger rutebegrænsningstasterne til IRouteConstraint-implementeringerne. Kodestykket nedenfor illustrerer, hvordan du kan føje dine brugerdefinerede begrænsninger til denne ordbog.

offentlig ugyldighed ConfigureServices (IServiceCollection-tjenester)

{  

services.Configure (routeOptions =>

  { 

routeOptions.ConstraintMap.Add ("emailconstraint", typeof (EmailRouteContraint));

  }); 

Implementere IRouteConstraint Match-metoden i ASP.NET Core

For at oprette en brugerdefineret rutebegrænsning skal du oprette en klasse, der udvider IRouteConstraint-grænsefladen og implementerer dens Match-metode. Begrænsningen kan bruges til at modvirke uønskede indgående anmodninger og forhindre, at en rute matches, medmindre en bestemt betingelse er opfyldt. For eksempel vil du muligvis sikre, at parameteren, der sendes til en handlingsmetode, altid er et heltal.

Matchmetoden accepterer følgende parametre:

  • HttpContext - indkapsler alle HTTP-specifikke oplysninger om en anmodning
  • IRouter - repræsenterer den router, der anvender begrænsningerne
  • RouteKey - repræsenterer den ruteparameter, der valideres
  • RouteDirection - et enum, der indeholder to værdier, nemlig IncomingRequest og UrlGeneration, og bruges til at angive, om URL'en behandles fra HTTP-anmodningen eller genererer en URL
  • RouteValues ​​- indeholder URL-parametrene

Struktur af en brugerdefineret rutebegrænsning i ASP.NET Core

Her er et eksempel på strukturen for en brugerdefineret rutebegrænsning:

offentlig klasse CustomRouteConstraint: IRouteConstraint

    {

public bool Match (HttpContext httpContext, IRouter-rute,

streng routeKey, RouteValueDictionary værdier,

RouteDirection routeDirection)

        {

smid ny NotImplementedException ();

        }

    }

Eksempel på brugerdefineret rutebegrænsning i ASP.NET Core

Lad os nu implementere en tilpasset rutebegrænsning, der kan kontrollere e-mail-id'er. Først skal du oprette en klasse, der udvider IRouteConstraint-grænsefladen og implementerer Match-metoden. Følgende kodestykke viser en brugerdefineret rutebegrænsningsklasse ved navn EmailRouteContraint, der udvider IRouteConstraint-grænsefladen.

offentlig klasse EmailRouteContraint: IRouteConstraint

    {

public bool Match (HttpContext httpContext, IRouter-rute,

streng routeKey, RouteValueDictionary værdier,

RouteDirection routeDirection)

        {

returner sandt;

        }

    }

Følgende kodeliste viser klassen EmailRouteConstraint med Match-metoden implementeret.

offentlig klasse EmailRouteContraint: IRouteConstraint

    {

public bool Match (HttpContext httpContext, IRouter-rute,

streng routeKey, RouteValueDictionary værdier,

RouteDirection routeDirection)

        {

if (values.TryGetValue (routeKey, out var routeValue))

            {

var parameterValueString = Convert.ToString (routeValue,

CultureInfo.InvariantCulture);

returner IsEmailAddressValid (parameterValueString);

            }

returner falsk;

        }

privat bool IsEmailAddressValid (streng emailAddress)

        {

returner sandt;

        }

    }

Bemærk, at IsEmailAddressValid-metoden her bare returnerer "sand". Jeg overlader til dig at skrive den nødvendige kode til validering af e-mail-adressen.

Registrer en tilpasset rutebegrænsning i ASP.NET Core

Du skal registrere din brugerdefinerede rutebegrænsning med routingsystemet i ConfigureServices-metoden i opstartklassen. Følgende kodestykke illustrerer dette.

offentlig ugyldighed ConfigureServices (IServiceCollection-tjenester)

      {

services.AddControllersWithViews ();

services.Configure (routeOptions =>

          {

routeOptions.ConstraintMap.Add ("ERC",

typeof (EmailRouteContraint));

          });

      }

Du skal også konfigurere din brugerdefinerede rutebegrænsning i konfigurationsmetoden i opstartklassen som vist i kodestykket nedenfor.

app.UseEndpoints (slutpunkter =>

{

endpoints.MapControllerRoute (

navn: "standard",

begrænsninger: ny {ERC = ny EmailRouteContraint ()},

mønster: "{controller = Home} / {action = Index} / {id?}");

});

Og det er det. Du kan nu angive begrænsningen i din controller eller dine handlingsmetoder og begynde at bruge applikationen.

ASP.NET Core runtime valideres, hvis det definerede mønster og rutebegrænsninger matcher mønsteret og værdierne for den indgående anmodning. Valideringslogikken for begrænsningen er defineret inden for Match-metoden for din brugerdefinerede rutebegrænsning. Du kan drage fordel af begrænsninger for at undgå unødvendige anmodninger samt for at validere ruteværdier, før anmodningen sendes til en handlingsmetode.

Sådan gør du mere i ASP.NET Core:

  • Sådan administreres brugerhemmeligheder i ASP.NET Core
  • Sådan opbygges gRPC-applikationer i ASP.NET Core
  • Sådan omdirigeres en anmodning i ASP.NET Core
  • Sådan bruges attributrute i ASP.NET Core
  • Sådan overføres parametre til handlingsmetoder i ASP.NET Core MVC
  • Sådan bruges API-analysatorer i ASP.NET Core
  • Sådan bruges rutedata tokens i ASP.NET Core
  • Sådan bruges API-versionering i ASP.NET Core
  • Sådan bruges dataoverførselsobjekter i ASP.NET Core 3.1
  • Sådan håndteres 404 fejl i ASP.NET Core MVC
  • Sådan bruges afhængighedsindsprøjtning i handlingsfiltre i ASP.NET Core 3.1
  • Sådan bruges indstillingsmønsteret i ASP.NET Core
  • Sådan bruges slutpunktsrute i ASP.NET Core 3.0 MVC
  • Sådan eksporteres data til Excel i ASP.NET Core 3.0
  • Sådan bruges LoggerMessage i ASP.NET Core 3.0
  • Sådan sendes e-mails i ASP.NET Core
  • Sådan logges data til SQL Server i ASP.NET Core
  • Sådan planlægger du job med Quartz.NET i ASP.NET Core
  • Sådan returneres data fra ASP.NET Core Web API
  • Sådan formateres svardata i ASP.NET Core
  • Sådan forbruges en ASP.NET Core Web API ved hjælp af RestSharp
  • Sådan udføres asynkroniseringshandlinger ved hjælp af Dapper
  • Sådan bruges funktionsflag i ASP.NET Core
  • Sådan bruges attributten FromServices i ASP.NET Core
  • Sådan arbejder du med cookies i ASP.NET Core
  • Sådan arbejder du med statiske filer i ASP.NET Core
  • Sådan bruges URL-omskrivning af Middleware i ASP.NET Core
  • Sådan implementeres hastighedsbegrænsning i ASP.NET Core
  • Sådan bruges Azure Application Insights i ASP.NET Core
  • Brug af avancerede NLog-funktioner i ASP.NET Core
  • Sådan håndteres fejl i ASP.NET Web API
  • Sådan implementeres global undtagelseshåndtering i ASP.NET Core MVC
  • Sådan håndteres nulværdier i ASP.NET Core MVC
  • Avanceret versionering i ASP.NET Core Web API
  • Sådan arbejder du med arbejdertjenester i ASP.NET Core
  • Sådan bruges Data Protection API i ASP.NET Core
  • Sådan bruges betinget middleware i ASP.NET Core
  • Sådan arbejder du med sessionstilstand i ASP.NET Core
  • Sådan skriver du effektive controllere i ASP.NET Core
$config[zx-auto] not found$config[zx-overlay] not found