Учебники

ASP.NET Core — Маршрутизация

В рамках MVC у нас есть три компонента, каждый из которых сосредоточен на определенной части работы. Чтобы все это работало, нам нужно найти способ отправлять эти HTTP-запросы нужному контроллеру. В ASP.NET Core MVC этот процесс называется маршрутизацией. Маршрутизация — это процесс направления HTTP-запроса на контроллер.

Давайте теперь разберемся, как перенаправлять запросы на разные контроллеры.

  • Промежуточному программному обеспечению ASP.NET Core необходим способ определить, должен ли данный HTTP-запрос передаваться на контроллер для обработки или нет.

  • Промежуточное программное обеспечение MVC примет это решение на основе URL-адреса и предоставленной нами информации о конфигурации. В этой главе мы определим эту информацию о конфигурации или вы можете сказать информацию о маршрутизации в Startup.cs, когда мы добавим промежуточное программное обеспечение MVC.

  • Этот подход часто упоминается как основанная на соглашении маршрутизация. Ниже приведен фрагмент кода для обычной маршрутизации.

Промежуточному программному обеспечению ASP.NET Core необходим способ определить, должен ли данный HTTP-запрос передаваться на контроллер для обработки или нет.

Промежуточное программное обеспечение MVC примет это решение на основе URL-адреса и предоставленной нами информации о конфигурации. В этой главе мы определим эту информацию о конфигурации или вы можете сказать информацию о маршрутизации в Startup.cs, когда мы добавим промежуточное программное обеспечение MVC.

Этот подход часто упоминается как основанная на соглашении маршрутизация. Ниже приведен фрагмент кода для обычной маршрутизации.

routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"); 
  • В этом подходе мы определяем шаблоны, которые сообщают MVC, как искать URL-адрес и находить имя контроллера и имя действия, где контроллер — это класс C #, а действие — открытый метод для этого класса.

В этом подходе мы определяем шаблоны, которые сообщают MVC, как искать URL-адрес и находить имя контроллера и имя действия, где контроллер — это класс C #, а действие — открытый метод для этого класса.

В последней главе мы создали контроллер (HomeController) в нашем приложении, который является классом C # и не должен быть производным от базового класса или реализовывать интерфейс или иметь какой-либо специальный атрибут. Это простой класс C # с именем HomeController, и он содержит метод Index, который возвращает строку.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppdemo.Controllers { 
   public class HomeController { 
      public string Index() { 
         return "Hello, World! this message is from Home Controller..."; 
      } 
   }
}     

Здесь мы собираемся сосредоточиться на маршрутизации на контроллеры . Мы также попытаемся понять, как работает маршрутизация.

Давайте теперь вернемся к классу Startup, где мы настроили промежуточное ПО MVC в наше приложение. Внутри метода Configure мы использовали метод UseMvcWithDefaultRoute .

public void Configure(IApplicationBuilder app) { 
   app.UseIISPlatformHandler();  
   
   app.UseDeveloperExceptionPage(); 
   app.UseRuntimeInfoPage();  
   
   app.UseFileServer(); 
   app.UseMvcWithDefaultRoute();  
   
   app.Run(async (context) => { 
      var msg = Configuration["message"]; 
      await context.Response.WriteAsync(msg); 
   });  
}

Это дает нам правило маршрутизации по умолчанию, которое позволяет нам добраться до HomeController . Вместо использования UseMvcWithDefaultRoute , давайте использовать UseMvc , а затем настроить маршрут в этой точке, используя именованный метод ConfigureRoute . Ниже приведена реализация файла Startup.cs.

using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Hosting; 
using Microsoft.AspNet.Http; 

using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Configuration; 
using Microsoft.AspNet.Routing; 
using System;  

namespace FirstAppDemo { 
   public class Startup { 
      public Startup() { 
         var builder = new ConfigurationBuilder() .AddJsonFile("AppSettings.json"); 
         Configuration = builder.Build(); 
      }  
      public IConfiguration Configuration { get; set; } 
      
      // This method gets called by the runtime. 
      // Use this method to add services to the container. 
      // For more information on how to configure your application, 
      // visit http://go.microsoft.com/fwlink/?LinkID=398940 
      public void ConfigureServices(IServiceCollection services) { 
         services.AddMvc(); 
      }  
        
      // This method gets called by the runtime.  
      // Use this method to configure the HTTP request pipeline. 
      public void Configure(IApplicationBuilder app) { 
         app.UseIISPlatformHandler();  
         
         app.UseDeveloperExceptionPage(); 
         app.UseRuntimeInfoPage();  
         
         app.UseFileServer(); 
         app.UseMvc(ConfigureRoute);  
         
         app.Run(async (context) => { 
            var msg = Configuration["message"]; 
            await context.Response.WriteAsync(msg); 
         });
      }  
      private void ConfigureRoute(IRouteBuilder routeBuilder) { 
         //Home/Index 
         routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}");
      }  
        
      // Entry point for the application. 
      public static void Main(string[] args) => WebApplication.Run<Startup>(args);
   } 
}  

Внутри метода ConfigureRoute вы можете настроить свои маршруты; Вы можете видеть, что этот метод должен принимать параметр типа IRouteBuilder. Цель маршрутизации — описать правила, которые ASP.NET Core MVC будет использовать для обработки HTTP-запроса и поиска контроллера, который может ответить на этот запрос.

  • Вы можете иметь один маршрут, который может отображать запросы на разные контроллеры.

  • Мы можем сообщить routeBuilder, что мы хотим отобразить новый маршрут, и его имя — «По умолчанию», а затем предоставить наиболее важную часть информации о маршрутизации, которая является шаблоном.

  • Шаблон представляет собой строку, и он собирается описать в ASP.NET Core MVC, как разделить URL-адрес.

  • В последнем примере мы добавили HomeController, поэтому вы также можете запросить любой из следующих URL-адресов, и они также будут направлены на действие Index на HomeController.

    • HTTP: // локальный: 49940
    • HTTP: // локальный: 49940 / Главная
    • HTTP: // локальный: 49940 / Home / Index
  • Когда браузер запрашивает http: // mysite / или http: // mysite / Home , он возвращает выходные данные из метода Index HomeController.

  • Вы также можете попробовать это, изменив URL в браузере. В этом примере это http: // localhost: 49940 /, за исключением того, что порт может быть другим.

  • Если вы добавите / Home или / Home / Index к URL-адресу и нажмете кнопку «Ввод», вы увидите тот же результат.

  • Знак вопроса в конце идентификатора означает, что этот параметр является необязательным. Другими словами, ASP.NET Core MVC здесь не нужно видеть какой-то идентификатор, который может быть числом, строкой или GUID.

Вы можете иметь один маршрут, который может отображать запросы на разные контроллеры.

Мы можем сообщить routeBuilder, что мы хотим отобразить новый маршрут, и его имя — «По умолчанию», а затем предоставить наиболее важную часть информации о маршрутизации, которая является шаблоном.

Шаблон представляет собой строку, и он собирается описать в ASP.NET Core MVC, как разделить URL-адрес.

В последнем примере мы добавили HomeController, поэтому вы также можете запросить любой из следующих URL-адресов, и они также будут направлены на действие Index на HomeController.

Когда браузер запрашивает http: // mysite / или http: // mysite / Home , он возвращает выходные данные из метода Index HomeController.

Вы также можете попробовать это, изменив URL в браузере. В этом примере это http: // localhost: 49940 /, за исключением того, что порт может быть другим.

Если вы добавите / Home или / Home / Index к URL-адресу и нажмете кнопку «Ввод», вы увидите тот же результат.

Знак вопроса в конце идентификатора означает, что этот параметр является необязательным. Другими словами, ASP.NET Core MVC здесь не нужно видеть какой-то идентификатор, который может быть числом, строкой или GUID.

Давайте запустим приложение в браузере. После запуска приложения вы увидите следующий вывод.

Выход

Вы можете увидеть всплывающее сообщение из промежуточного программного обеспечения app.Run, и причина, по которой мы получаем это сообщение, заключается в том, что промежуточное программное обеспечение MVC увидело этот URL. Это был запрос к корню веб-сайта, который не нашел имя контроллера или имя действия в URL. Корень сайта прекратил обработку этого запроса и передал его следующему компоненту промежуточного программного обеспечения, который является кодом app.Run . Шаблон для маршрута, который мы указали, тихий в отличие от шаблона по умолчанию.

В шаблоне по умолчанию есть некоторые значения по умолчанию, которые применяются, если контроллер и имя действия не найдены. Если запрос поступает в корень сайта, именем контроллера по умолчанию будет Home. Вы можете изменить его на любой другой контроллер, если хотите, и именем действия по умолчанию может быть Index. Вы также можете изменить действие по умолчанию, если хотите, как показано в следующей программе.

private void ConfigureRoute(IRouteBuilder routeBuilder) { 
   //Home/Index 
   routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}"); 
}

Если запрос поступает в корневой каталог веб-сайта, MVC не видит URL-адрес контроллера / действия, но может использовать эти значения по умолчанию.

Давайте сохраним файл Startup.cs и обновим браузер до корня сайта.

Корень сайта

Теперь вы увидите ответ от вашего контроллера, и вы также можете перейти в / home, который вызовет действие по умолчанию, то есть index. Вы также можете перейти в / home / index и теперь MVC будет извлекать имя контроллера и имя действия из URL.

Давайте создадим еще один контроллер, добавив еще один класс и назовем его AboutController .

О контроллере

Давайте добавим несколько простых методов действия, которые будут возвращать строку, как показано в следующей программе.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppDemo.Controllers  { 
   public class AboutController { 
      public string Phone() { 
         return "+49-333-3333333"; 
      }  
      public string Country() { 
         return "Germany"; 
      } 
   } 
} 

В этом контроллере вы можете увидеть два метода действий — Телефон и Страна, которые будут возвращать только номер телефона и название страны соответственно. Позже мы познакомимся с модным HTML. Давайте сохраним этот файл и укажите / about / phone в конце корневого URL.

Два метода действий

Вы можете увидеть номер телефона, как на скриншоте выше. Если вы укажете / about / country , вы также увидите название страны.

Название страны

Если вы зайдете в / о , оно снова провалится через промежуточное ПО и перейдет к вашему приложению. Запустите промежуточное ПО, и вы увидите следующую страницу.

Около

Здесь ASP.NET Core MVC переходит к AboutController, но не находит указанное действие. Таким образом, он по умолчанию будет использовать индекс, и у этого контроллера нет метода индекса, а затем запрос перейдет к следующему компоненту промежуточного программного обеспечения.