Как да използвам маршрутизиране на атрибути в ASP.NET Core

Междинният софтуер за маршрутизация в ASP.NET Core е вещ в картографирането на входящите заявки към съответните манипулатори на маршрути. Можете да настроите маршрутизация в ASP.NET Core по два различни начина: маршрутизиране въз основа на атрибути и маршрутизиране, базирано на конвенции.

За разлика от конвенционалното маршрутизиране, при което информацията за маршрутизацията се посочва на едно място, маршрутизирането на атрибути ви позволява да внедрите маршрутизиране, като декорирате вашите методи за действие с атрибути. Тази статия представя дискусия за това как можем да работим с базирана на атрибути маршрутизация в ASP.NET Core MVC.

За да работите с примерите за кодове, предоставени в тази статия, трябва да имате Visual Studio 2019 инсталиран във вашата система. Ако все още нямате копие, можете да изтеглите Visual Studio 2019 тук. 

Създайте ASP.NET Core 3.1 MVC проект в Visual Studio 2019

Първо, нека създадем проект ASP.NET Core в Visual Studio 2019. Ако приемем, че Visual Studio 2019 е инсталиран във вашата система, следвайте стъпките, описани по-долу, за да създадете нов ASP.NET Core проект в Visual Studio.

  1. Стартирайте Visual Studio IDE.
  2. Кликнете върху „Създаване на нов проект“.
  3. В прозореца „Създаване на нов проект“ изберете „ASP.NET Core Web Application“ от показания списък с шаблони.
  4. Щракнете върху Напред.
  5. В прозореца „Конфигуриране на вашия нов проект“ посочете името и местоположението на новия проект.
  6. По избор поставете отметка в квадратчето „Поставяне на решение и проект в една и съща директория“, в зависимост от вашите предпочитания.
  7. Щракнете върху Създаване.
  8. В прозореца „Създаване на ново уеб приложение на ASP.NET Core“, показан по-нататък, изберете .NET Core като време на изпълнение и ASP.NET Core 3.1 (или по-нова версия) от падащия списък в горната част.
  9. Изберете „Уеб приложение (Model-View-Controller)“ като шаблон на проекта, за да създадете ново приложение на ASP.NET Core MVC. 
  10. Уверете се, че квадратчетата „Активиране на поддръжката на Docker“ и „Конфигуриране за HTTPS“ са отметнати, тъй като тук няма да използваме тези функции.
  11. Уверете се, че удостоверяването е настроено на „Без удостоверяване“, тъй като и ние няма да използваме удостоверяване.
  12. Щракнете върху Създаване.

Следвайки тези стъпки, ще създадете нов ASP.NET Core MVC проект в Visual Studio 2019. Ще използваме този проект в секциите по-долу, за да илюстрираме как можем да работим с маршрутизиране на атрибути в ASP.NET Core 3.1.

Създайте клас на контролер в ASP.NET Core MVC

Създайте нов контролер с име DefaultController и заменете изходния код по подразбиране на DefaultController със следния код:

    публичен клас DefaultController: Controller

    {

        [Маршрут ("")]

        [Маршрут („По подразбиране“)]

        [Маршрут („По подразбиране / индекс“)]

        индекс на публичен ActionResult ()

        {

            върнете нов EmptyResult ();

        }

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

        публичен ActionResult GetRecordsById (int id)

        {

            низ str = низ.Формат

            ("Идентификаторът, предаден като параметър, е: {0}", id);

            връщане Ok (str);

        }

    }

Използвайте маршрутизиране на атрибути на ниво контролер в ASP.NET Core

Маршрутизирането на атрибутите може да се използва както на нивата на контролера, така и на метода на действие. Ако приложим атрибута route на ниво контролер, тогава маршрутът е приложим за всички методи за действие на този контролер.

Ако разгледате нашия клас DefaultController, ще забележите, че маршрутът по подразбиране се използва многократно при задаване на шаблона за маршрут за методите за действие. Следният кодов фрагмент показва как можете да зададете различни атрибути на маршрута на ниво контролер, за да използвате по-гъвкаво маршрутизиране на атрибути.

[Маршрут („По подразбиране“)]   

публичен клас DefaultController: Controller

{

  [Маршрут ("")]

  [Маршрут („Индекс“)]

  индекс на публичен ActionResult ()

  {

      върнете нов EmptyResult ();

   }

  [HttpGet]

  Маршрут ("Default / GetRecordsById / {id}")]

  публичен ActionResult GetRecordsById (int id)

  {

      низ str = string.Format ("Идентификаторът, предаден като параметър, е: {0}", id);

      връщане Ok (str);

   }

}

Когато се използват атрибути на маршрут както на нивата на контролера, така и на метода на действие, шаблонът на маршрута, приложен на ниво контролер, се добавя към шаблона на маршрут, посочен на ниво метод на действие.

Може често да се нуждаете от общ префикс за вашия контролер. Когато го направите, трябва да използвате атрибута [RoutePrefix], както е показано в кодовия фрагмент, даден по-долу.

[RoutePrefix („услуги“)]

публичен клас HomeController: Контролер

{

   // Методи за действие

}

Използвайте маршрутизиране на атрибути на ниво метод на действие в ASP.NET Core

Обърнете се към класа DefaultController, показан по-горе. Както можете да видите, посочихме три маршрута в метода Index на класа DefaultController. Това предполага, че всеки от следните URL адреси ще извиква метода на действие Index () на DefaultController.

// localhost: 11277

// localhost: 11277 / начало

// localhost: 11277 / home / index

Както при маршрутизацията, базирана на конвенции, можете да зададете параметри и в маршрутизирането въз основа на атрибути. С други думи, базирането на атрибути ви позволява да задавате атрибути на маршрута с параметри. Методът за действие GetRecordsById на класа DefaultController, показан по-рано, е пример.

Имайте предвид, че „{id}“ в посочения маршрут представлява параметър или притежател на място. Параметърът id в този пример може да бъде всичко, като низ или цяло число. Ами ако искате да ограничите параметъра само до цели числа? Можете да постигнете това, като използвате ограничения.

Използвайте ограничения на атрибути на маршрута в метод на действие

Ограниченията на маршрута се използват за осуетяване на невалидни заявки за действия на контролера. Например може да искате да се уверите, че параметърът, предаден на метод за действие, винаги е цяло число. Синтаксисът на използването на ограничения на маршрута е {параметър: ограничение}. Следният кодов фрагмент илюстрира това. Имайте предвид, че параметърът id винаги е цяло число.

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

публичен ActionResult GetRecordsById (int id)

{

  низ str = string.Format ("Идентификаторът, предаден като параметър, е: {0}", id);

  връщане Ok (str);

}

Използвайте незадължителни параметри в спецификациите на маршрута на атрибутите

Можете също да използвате незадължителни параметри в спецификацията на вашия маршрут. Следният кодов фрагмент показва как може да се постигне това. Имайте предвид, че методът на действие в този случай ще бъде изпълнен, дори ако параметърът id не е предаден.

[Маршрут („Продажби / GetSalesByRegionId / {id?}“)]

Важно е да се разбере, че когато се използва маршрутизиране на атрибути, нито името на контролера, нито името на метода на действие играят никаква роля при избора кой метод на действие ще бъде изпълнен. Нека да видим това с пример. Следният кодов фрагмент илюстрира как URL адресът е променен в спецификацията на маршрута за метода за действие GetRecordsById.

[Маршрут („Начало / GetRecordsById / {id: int}“)]

публичен ActionResult GetRecordsById (int id)

{

   низ str = string.Format ("Идентификаторът, предаден като параметър, е: {0}", id);

   връщане Ok (str);

}

Вече можете да извикате метода за действие GetRecordsById, като използвате следния URL:

// localhost: 11277 / home / GetRecordsById / 1

Използвайте множество ограничения на атрибутен маршрут в метод на действие

Също така е възможно да се приложат множество ограничения към параметър. Следният кодов фрагмент илюстрира как това може да се постигне. Обърнете внимание, че минималната стойност на параметъра id трябва да бъде 1, в противен случай ще се върне грешка 404.

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

публичен ActionResult GetRecordsById (int id)

{

    низ str = string.Format ("Идентификаторът, предаден като параметър, е: {0}", id);

    връщане Ok (str);

}

Използвайте HTTP глаголи в атрибутни маршрути в метод на действие

Можете дори да използвате HTTP глаголи при маршрутизиране на атрибути. Следният кодов фрагмент показва как може да се постигне това.

[HttpGet]

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

публичен ActionResult GetRecordsById (int id)

{

  низ str = string.Format ("Идентификаторът, предаден като параметър, е: {0}", id);

  връщане Ok (str);

}

Често използвани ограничения на атрибутен маршрут 

Ето списък на най-често използваните ограничения на маршрута в ASP.NET Core. 

  • bool - използва се за съвпадение на булева стойност
  • datetime - използва се за съвпадение на стойност DateTime
  • десетична - използва се за съвпадение на десетична стойност
  • double - използва се за съвпадение на 64-битова стойност с плаваща запетая
  • float - използва се за съвпадение на 32-битова стойност с плаваща запетая
  • guide - използва се за съвпадение на GUID стойност
  • int - използва се за съвпадение на 32-битова целочислена стойност
  • long - използва се за съвпадение на 64-битова целочислена стойност
  • max - използва се за съвпадение на цяло число с максимална стойност
  • min - използва се за съвпадение на цяло число с минимална стойност
  • minlength - използва се за съвпадение на низ с минимална дължина
  • регулярно изражение - използва се за съвпадение на регулярен израз

Създаване на ограничения за маршрут на атрибут 

Можете също така да създадете свои собствени ограничения по маршрут, като създадете клас, който разширява интерфейса IRouteConstraint и реализира метода Match, както е показано в кодовия фрагмент, даден по-долу.

публичен клас CustomRouteConstraint: IRouteConstraint

    {

        публичен bool Match (HttpContext httpContext, IRouter route,

        низ routeKey,

        RouteValueDictionary стойности, RouteDirection routeDirection)

        {

            хвърли нов NotImplementedException ();

        }

    }

Използвайте замяна на токен в атрибутни маршрути на ниво контролер

Маршрутизирането на атрибути в ASP.NET Core MVC осигурява поддръжка за друга интересна функция, наречена замяна на маркера. Можете да използвате маркерите [действие], [област] и [контролер] във вашия контролер и тези маркери ще бъдат заменени съответно от имената на действие, област и контролер. Следният кодов фрагмент илюстрира как това може да се постигне.

[Маршрут („[контролер] / [действие]“)]

публичен клас HomeController: Контролер

{

   частен ILogger _logger само за четене;

   публичен HomeController (регистратор на ILogger)

   {

       _logger = регистратор;

   }

   публичен индекс на IActionResult ()

   {

       return View ();

   }

   // Други методи за действие

}

Маршрутизирането на атрибути в ASP.NET Core ви дава повече контрол и гъвкавост над URI адресите във вашето уеб приложение. Въпреки че маршрутизацията, базирана на конвенции, може да бъде конфигурирана на едно място, което от своя страна може да се приложи към всички контролери във вашето приложение, е трудно да се поддържат някои URI модели (като API за версиониране) с маршрутизиране, базирано на конвенции.

Използвайки маршрутизация на атрибути, можете да отделите имената на контролера и действията от шаблона на маршрута. Можете дори да използвате комбинация от маршрутизация, базирана на конвенции и базирана на атрибути, във вашите приложения на ASP.NET Core.

Как да направите повече в ASP.NET Core:

  • Как да предавам параметри на методи за действие в ASP.NET Core MVC
  • Как да използвам API анализатори в ASP.NET Core
  • Как да използваме маркери за данни за маршрути в ASP.NET Core
  • Как да използвам версирането на API в ASP.NET Core
  • Как да използвам обекти за прехвърляне на данни в ASP.NET Core 3.1
  • Как да се справя с 404 грешки в ASP.NET Core MVC
  • Как да използвам инжектиране на зависимост във филтри за действие в ASP.NET Core 3.1
  • Как да използвам шаблона за опции в ASP.NET Core
  • Как да използвам маршрутизиране на крайни точки в ASP.NET Core 3.0 MVC
  • Как да експортирам данни в Excel в ASP.NET Core 3.0
  • Как да използвам LoggerMessage в ASP.NET Core 3.0
  • Как да изпращате имейли в ASP.NET Core
  • Как да регистрирам данни в SQL Server в ASP.NET Core
  • Как да планирате работни места с помощта на Quartz.NET в ASP.NET Core
  • Как да върнете данни от ASP.NET Core Web API
  • Как да форматирате данните за отговор в ASP.NET Core
  • Как да консумирате ASP.NET Core Web API с помощта на RestSharp
  • Как да извършвате асинхронни операции с помощта на Dapper
  • Как да използваме флагове на функции в ASP.NET Core
  • Как да използвам атрибута FromServices в ASP.NET Core
  • Как да работите с бисквитки в ASP.NET Core
  • Как да работя със статични файлове в ASP.NET Core
  • Как да използвам URL пренаписване на Middleware в ASP.NET Core
  • Как да приложим ограничаване на скоростта в ASP.NET Core
  • Как да използвам Azure Application Insights в ASP.NET Core
  • Използване на разширени функции на NLog в ASP.NET Core
  • Как да се справим с грешки в ASP.NET Web API
  • Как да приложим обработка на глобални изключения в ASP.NET Core MVC
  • Как да се справя с нулеви стойности в ASP.NET Core MVC
  • Разширено създаване на версии в ASP.NET Core Web API
  • Как да работя с услуги за работници в ASP.NET Core
  • Как да използвам API за защита на данните в ASP.NET Core
  • Как да използвам условен мидълуер в ASP.NET Core
  • Как да работите със състоянието на сесията в ASP.NET Core
  • Как да пишете ефективни контролери в ASP.NET Core