Jak używać routingu atrybutów w ASP.NET Core

Oprogramowanie pośredniczące routingu w ASP.NET Core doskonale radzi sobie z mapowaniem żądań przychodzących do odpowiednich programów obsługi tras. Możesz skonfigurować routing w ASP.NET Core na dwa różne sposoby: routing oparty na atrybutach i routing oparty na konwencji.

W przeciwieństwie do routingu opartego na konwencji, w którym informacje o routingu są określone w jednej lokalizacji, routing atrybutów umożliwia zaimplementowanie routingu poprzez dekorowanie metod akcji atrybutami. W tym artykule omówiono sposób pracy z routingiem opartym na atrybutach w ASP.NET Core MVC.

Aby pracować z przykładami kodu przedstawionymi w tym artykule, w systemie powinien być zainstalowany program Visual Studio 2019. Jeśli nie masz jeszcze kopii, możesz pobrać program Visual Studio 2019 tutaj. 

Utwórz projekt ASP.NET Core 3.1 MVC w programie Visual Studio 2019

Po pierwsze, utwórzmy projekt ASP.NET Core w programie Visual Studio 2019. Zakładając, że w systemie jest zainstalowany program Visual Studio 2019, wykonaj czynności opisane poniżej, aby utworzyć nowy projekt ASP.NET Core w programie Visual Studio.

  1. Uruchom środowisko IDE programu Visual Studio.
  2. Kliknij „Utwórz nowy projekt”.
  3. W oknie „Utwórz nowy projekt” wybierz „Aplikacja sieci Web ASP.NET Core” z wyświetlonej listy szablonów.
  4. Kliknij Następny.
  5. W oknie „Konfiguruj nowy projekt” określ nazwę i lokalizację nowego projektu.
  6. Opcjonalnie zaznacz pole wyboru „Umieść rozwiązanie i projekt w tym samym katalogu”, w zależności od preferencji.
  7. Kliknij Utwórz.
  8. W wyświetlonym obok oknie „Tworzenie nowej aplikacji sieci Web ASP.NET Core” wybierz .NET Core jako środowisko uruchomieniowe i ASP.NET Core 3.1 (lub nowszy) z listy rozwijanej u góry.
  9. Wybierz „Web Application (Model-View-Controller)” jako szablon projektu, aby utworzyć nową aplikację ASP.NET Core MVC. 
  10. Upewnij się, że pola wyboru „Włącz obsługę Dockera” i „Konfiguruj dla HTTPS” są odznaczone, ponieważ nie będziemy tutaj używać tych funkcji.
  11. Upewnij się, że uwierzytelnianie jest ustawione na „Brak uwierzytelniania”, ponieważ również nie będziemy używać uwierzytelniania.
  12. Kliknij Utwórz.

Wykonanie tych kroków spowoduje utworzenie nowego projektu ASP.NET Core MVC w programie Visual Studio 2019. Użyjemy tego projektu w poniższych sekcjach, aby zilustrować, jak możemy pracować z routingiem atrybutów w ASP.NET Core 3.1.

Utwórz klasę kontrolera w ASP.NET Core MVC

Utwórz nowy kontroler o nazwie DefaultController i zamień domyślny kod źródłowy DefaultController na następujący kod:

    public class DefaultController: Controller

    {

        [Trasa("")]

        [Trasa („Domyślna”)]

        [Trasa („Domyślna / Indeks”)]

        public ActionResult Index ()

        {

            return new EmptyResult ();

        }

        [Route ("Default / GetRecordsById / {id}")]

        public ActionResult GetRecordsById (int id)

        {

            string str = string.Format

            („Identyfikator przekazany jako parametr to: {0}”, identyfikator);

            return Ok (str);

        }

    }

Użyj routingu atrybutów na poziomie kontrolera w ASP.NET Core

Routing atrybutów może być używany zarówno na poziomie kontrolera, jak i metody akcji. Jeśli zastosujemy atrybut route na poziomie kontrolera, wtedy trasa będzie miała zastosowanie do wszystkich metod akcji tego kontrolera.

Jeśli przeanalizujesz naszą klasę DefaultController, zauważysz, że trasa domyślna jest używana wiele razy podczas określania szablonu trasy dla metod akcji. Poniższy fragment kodu pokazuje, jak można określić różne atrybuty trasy na poziomie kontrolera, aby bardziej elastycznie korzystać z routingu atrybutów.

[Trasa („Domyślna”)]   

public class DefaultController: Controller

{

  [Trasa("")]

  [Trasa („Indeks”)]

  public ActionResult Index ()

  {

      return new EmptyResult ();

   }

  [HttpGet]

  Trasa („Default / GetRecordsById / {id}”)]

  public ActionResult GetRecordsById (int id)

  {

      string str = string.Format ("Identyfikator przekazany jako parametr to: {0}", id);

      return Ok (str);

   }

}

W przypadku korzystania z atrybutów trasy zarówno na poziomie kontrolera, jak i na poziomie metody akcji, szablon trasy zastosowany na poziomie kontrolera jest dołączany do szablonu trasy określonego na poziomie metody akcji.

Często możesz potrzebować wspólnego prefiksu dla swojego kontrolera. Kiedy to zrobisz, powinieneś użyć atrybutu [RoutePrefix], jak pokazano we fragmencie kodu podanym poniżej.

[RoutePrefix ("usługi")]

Public Class HomeController: Controller

{

   // Metody akcji

}

Użyj routingu atrybutów na poziomie metody akcji w ASP.NET Core

Zapoznaj się z klasą DefaultController pokazaną powyżej. Jak widać, w metodzie Index klasy DefaultController określiliśmy trzy trasy. Oznacza to, że każdy z poniższych adresów URL wywoła metodę akcji Index () elementu DefaultController.

// localhost: 11277

// localhost: 11277 / home

// localhost: 11277 / home / index

Podobnie jak w przypadku routingu opartego na konwencji, można również określić parametry w routingu opartym na atrybutach. Innymi słowy, routing oparty na atrybutach umożliwia określenie atrybutów trasy z parametrami. Przykładem jest metoda akcji GetRecordsById klasy DefaultController pokazana wcześniej.

Zauważ, że „{id}” w określonej trasie reprezentuje parametr lub symbol zastępczy. Parametr id w tym przykładzie może mieć dowolną wartość, na przykład ciąg znaków lub liczbę całkowitą. A co, jeśli chcesz ograniczyć parametr tylko do liczb całkowitych? Możesz to osiągnąć za pomocą ograniczeń.

Użyj ograniczeń trasy atrybutów w metodzie akcji

Ograniczenia trasy służą do udaremniania nieprawidłowych żądań akcji kontrolera. Na przykład możesz chcieć upewnić się, że parametr przekazany do metody akcji jest zawsze liczbą całkowitą. Składnia używania ograniczeń trasy to {parametr: ograniczenie}. Ilustruje to poniższy fragment kodu. Zauważ, że parametr id jest zawsze liczbą całkowitą.

[Route ("Default / GetRecordsById / {id: int}")]

public ActionResult GetRecordsById (int id)

{

  string str = string.Format ("Identyfikator przekazany jako parametr to: {0}", id);

  return Ok (str);

}

Użyj parametrów opcjonalnych w specyfikacjach tras atrybutów

Możesz także użyć parametrów opcjonalnych w specyfikacji trasy. Poniższy fragment kodu pokazuje, jak można to osiągnąć. Zauważ, że metoda akcji w tym przypadku zostanie wykonana, nawet jeśli parametr id nie zostanie przekazany.

[Route ("Sales / GetSalesByRegionId / {id?}")]

Ważne jest, aby zrozumieć, że podczas korzystania z routingu atrybutów ani nazwa kontrolera, ani nazwa metody akcji nie odgrywają żadnej roli w wyborze metody akcji, która zostanie wykonana. Zobaczmy to na przykładzie. Poniższy fragment kodu ilustruje zmianę adresu URL w specyfikacji trasy dla metody akcji GetRecordsById.

[Route ("Home / GetRecordsById / {id: int}")]

public ActionResult GetRecordsById (int id)

{

   string str = string.Format ("Identyfikator przekazany jako parametr to: {0}", id);

   return Ok (str);

}

Możesz teraz wywołać metodę akcji GetRecordsById przy użyciu następującego adresu URL:

// localhost: 11277 / home / GetRecordsById / 1

Użyj wielu ograniczeń trasy atrybutów w metodzie akcji

Możliwe jest również zastosowanie wielu ograniczeń do parametru. Poniższy fragment kodu ilustruje, jak można to osiągnąć. Zwróć uwagę, że minimalna wartość parametru id powinna wynosić 1, w przeciwnym razie zostanie zwrócony błąd 404.

[Route ("Default / GetRecordsById / {id: int: min (1)}")]

public ActionResult GetRecordsById (int id)

{

    string str = string.Format ("Identyfikator przekazany jako parametr to: {0}", id);

    return Ok (str);

}

Użyj zleceń HTTP w trasach atrybutów w metodzie akcji

Możesz nawet używać czasowników HTTP w routingu atrybutów. Poniższy fragment kodu pokazuje, jak można to osiągnąć.

[HttpGet]

[Route ("Default / GetRecordsById / {id: int: min (1)}")]

public ActionResult GetRecordsById (int id)

{

  string str = string.Format ("Identyfikator przekazany jako parametr to: {0}", id);

  return Ok (str);

}

Powszechnie używane ograniczenia trasy atrybutów 

Oto lista najczęściej używanych ograniczeń trasy w ASP.NET Core. 

  • bool - używany do dopasowania wartości logicznej
  • datetime - używane do dopasowania wartości DateTime
  • decimal - służy do dopasowania wartości dziesiętnej
  • double - używany do dopasowania 64-bitowej wartości zmiennoprzecinkowej
  • float - używany do dopasowania 32-bitowej wartości zmiennoprzecinkowej
  • guid - używany do dopasowania wartości identyfikatora GUID
  • int - używany do dopasowania 32-bitowej wartości całkowitej
  • long - używany do dopasowania 64-bitowej wartości całkowitej
  • max - służy do dopasowania liczby całkowitej o maksymalnej wartości
  • min - służy do dopasowania liczby całkowitej o minimalnej wartości
  • minlength - służy do dopasowania ciągu o minimalnej długości
  • regex - używane do dopasowania wyrażenia regularnego

Utwórz ograniczenia trasy atrybutu niestandardowego 

Możesz również utworzyć własne niestandardowe ograniczenia trasy, tworząc klasę, która rozszerza interfejs IRouteConstraint i implementuje metodę Match, jak pokazano we fragmencie kodu podanym poniżej.

publiczna klasa CustomRouteConstraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, trasa IRoutera,

        string routeKey,

        RouteValueDictionary wartości, RouteDirection routeDirection)

        {

            wyrzucić nowy NotImplementedException ();

        }

    }

Użyj zastępowania tokenu w trasach atrybutów na poziomie kontrolera

Routing atrybutów w ASP.NET Core MVC zapewnia obsługę innej interesującej funkcji o nazwie zastępowanie tokenu. Możesz użyć tokenów [akcja], [obszar] i [kontroler] w kontrolerze, a te żetony zostaną zastąpione odpowiednio nazwami akcji, obszaru i kontrolera. Poniższy fragment kodu ilustruje, jak można to osiągnąć.

[Route („[kontroler] / [akcja]”)]

Public Class HomeController: Controller

{

   prywatny tylko do odczytu ILogger _logger;

   public HomeController (rejestrator ILogger)

   {

       _logger = logger;

   }

   publiczny indeks IActionResult ()

   {

       return View ();

   }

   // Inne metody akcji

}

Routing atrybutów w ASP.NET Core zapewnia większą kontrolę i elastyczność w zakresie identyfikatorów URI w aplikacji internetowej. Chociaż routing oparty na konwencji można skonfigurować w pojedynczej lokalizacji, którą z kolei można zastosować do wszystkich kontrolerów w aplikacji, trudno jest obsługiwać niektóre wzorce URI (takie jak przechowywanie wersji interfejsu API) w przypadku routingu opartego na konwencji.

Korzystając z routingu atrybutów, można oddzielić nazwy kontrolera i akcji od szablonu trasy. Możesz nawet użyć kombinacji routingu opartego na konwencji i routingu opartego na atrybutach w aplikacjach ASP.NET Core.

Jak zrobić więcej w ASP.NET Core:

  • Jak przekazać parametry do metod akcji w ASP.NET Core MVC
  • Jak używać analizatorów API w ASP.NET Core
  • Jak używać tokenów danych trasy w ASP.NET Core
  • Jak korzystać z obsługi wersji interfejsu API w ASP.NET Core
  • Jak używać obiektów transferu danych w ASP.NET Core 3.1
  • Jak obsługiwać błędy 404 w ASP.NET Core MVC
  • Jak używać iniekcji zależności w filtrach akcji w ASP.NET Core 3.1
  • Jak używać wzorca opcji w ASP.NET Core
  • Jak używać routingu punktów końcowych w ASP.NET Core 3,0 MVC
  • Jak wyeksportować dane do programu Excel w ASP.NET Core 3,0
  • Jak używać LoggerMessage w ASP.NET Core 3,0
  • Jak wysyłać wiadomości e-mail w ASP.NET Core
  • Jak rejestrować dane w programie SQL Server w ASP.NET Core
  • Jak planować zadania przy użyciu Quartz.NET w ASP.NET Core
  • Jak zwrócić dane z ASP.NET Core Web API
  • Jak sformatować dane odpowiedzi w ASP.NET Core
  • Jak korzystać z ASP.NET Core Web API przy użyciu RestSharp
  • Jak wykonywać operacje asynchroniczne przy użyciu Dapper
  • Jak używać flag funkcji w ASP.NET Core
  • Jak używać atrybutu FromServices w ASP.NET Core
  • Jak pracować z plikami cookie w ASP.NET Core
  • Jak pracować z plikami statycznymi w ASP.NET Core
  • Jak używać oprogramowania pośredniczącego ponownego zapisywania adresów URL w ASP.NET Core
  • Jak zaimplementować ograniczanie szybkości w ASP.NET Core
  • Jak używać usługi Azure Application Insights w ASP.NET Core
  • Korzystanie z zaawansowanych funkcji NLog w ASP.NET Core
  • Jak obsługiwać błędy w ASP.NET Web API
  • Jak zaimplementować globalną obsługę wyjątków w ASP.NET Core MVC
  • Jak obsługiwać wartości null w ASP.NET Core MVC
  • Zaawansowane przechowywanie wersji w ASP.NET Core Web API
  • Jak pracować z usługami roboczymi w ASP.NET Core
  • Jak używać interfejsu API ochrony danych w ASP.NET Core
  • Jak używać warunkowego oprogramowania pośredniczącego w ASP.NET Core
  • Jak pracować ze stanem sesji w ASP.NET Core
  • Jak pisać wydajne kontrolery w ASP.NET Core