Собственная маршрутизация в ASP.NET Core MVC

  • Михаил
  • 12 мин. на прочтение
  • 95
  • 24 Nov 2022
  • 24 Nov 2022

Если вы хотите определить свой собственный маршрут, вам нужно использовать промежуточное ПО UseMvc вместо UseMvcWithDefaultRoute(). В методе Configure файла класса Startup используйте промежуточное ПО UseMVC и в этом промежуточном ПО вызовите метод MapRoute, чтобы определить свой собственный маршрут, как показано в коде ниже.

public clas Startup
{
    public void Configure(IApplicationBuilder app, IHostringEnviroment env)
    {
        app.UseMvc(routes => {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action}");
        });
    }
}

Приведенный выше пример является самым простым из возможных маршрутов на основе соглашения для приложения ASP.NET Core MVC. Теперь запустите приложение и перейдите по следующим URL-адресам, и вы увидите результат, как и ожидалось.

http://localhost:5000/Student/Details
http://localhost:5000/Student/Index

А что, если мы хотим иметь более конкретные маршруты? Скажем что-то вроде этого:

http://localhost:5000/Student/Details/20
http://localhost:5000/Student/Index/10

Если вы хотите, чтобы методы действия вашего контроллера соответствовали приведенным выше URL-адресам, то вам необходимо использовать ограничения маршрута.

Ограничения маршрутов в приложении ASP.NET Core MVC:

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

http://localhost:5000/Student/Index/10
http://localhost:5000/Student/Details/20

Для этого одним из самых простых способов является определение маршрута, как показано ниже:

public void Configure(IApplicationBuilder app, IHostringEnviroment env)
{
    app.UseMvc(routes => {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action}/{id}");
    });
}

Теперь отредактируем StudentController, как показано ниже.

using Microsoft.AspNetCore.Mvc;

namespace FirstCoreMVCApplication.Controllers
{
    public class StudentController : Controller
    {
        public string Index(string count)
        {
            return "Index() Action Method of StudentController";
        }
        public string Details(string id)
        {
            return "Details() Action Method of StudentController";
        }
    }
}

Теперь запустите приложение и перейдите к соответствующим URL-адресам, и вы увидите, что методы выполняются, как и ожидается.

Проблема с указанным маршрутом заключается в том, что он может принимать значения любого типа. Если вы передаете строковые значения вместо целого числа, например http://localhost:5000/Student/Details/ABC, то он также принимает эти значения и выполняет методы действия.

Если вы хотите ограничить значение параметра id только целым числом, вам нужно использовать концепцию, называемую ограничением маршрута, как показано ниже:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace FirstCoreMVCApplication
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name:"default", 
                    template: "{controller}/{action}/{id:int}");
            });
        }
    }
}

Примечание. {Id: int} в определении шаблона указывает, что все, что находится в этой части URL-адреса, должно быть целым числом, в противном случае URL-адрес не сопоставляется с этим маршрутом.

С учетом вышеуказанных изменений запустите приложение и перейдите по URL-адресам, указанным ниже, и вы увидите ошибку 404. Это потому, что здесь мы передаем значение параметра Id как ABC.

http://localhost:5000/Student/Details/ABC
http://localhost:5000/Student/index/ABC

Теперь передайте значение параметра id как целое число, и вы должны получить результат, как и ожидалось. Есть много ограничений маршрута, которые вы можете использовать. Список ограничений приведен ниже:

  • Int
  • Bool
  • Datetime
  • Decimal
  • Guid
  • length(min,max)
  • alpha
  • range(min,max)

Необязательные параметры маршрута

Прежде чем разбираться в дополнительных параметрах, давайте сначала изменим StudentController, как показано ниже.

using Microsoft.AspNetCore.Mvc;

namespace FirstCoreMVCApplication.Controllers
{
    public class StudentController : Controller
    {
        public string Index()
        {
            return "Index() Action Method of StudentController";
        }
        public string Details(string id)
        {
            return "Details() Action Method of StudentController";
        }
    }
}

Как видите, метод действия Index не принимает никаких параметров, а метод действия Details принимает один параметр. Теперь нам нужно вызвать метод действия Index без параметра. С другой стороны, нам нужно сделать параметр id метода действия Details необязательным. Это означает, что метод действия Details должен вызываться с использованием URL следующего типа:

http://localhost:5000/Student/Details
http://localhost:5000/Student/Details/10

Чтобы достичь этого, нам нужно использовать необязательные параметры в наших условных маршрутах, добавив знак вопроса ? к ограничению необязательного параметра, как показано ниже.

using FirstCoreMVCApplication.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace FirstCoreMVCApplication
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name:"default", 
                    template: "{controller}/{action}/{id:int?}");
            });
        }
    }
}

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

Предоставление значений по умолчанию для маршрутов в приложении ASP.NET Core MVC:

Используя значения по умолчанию, мы можем указать, что произойдет, если части маршрута не указаны в URL. Например, когда мы переходим по URL, указанным ниже:

http://localhost:5000/
http://localhost:5000/Home

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

public class Startup
{
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name:"default", 
                template: "{controller}/{action}/{id:int?}");
        });
    }
}

Отредактируем HomeController, как показано ниже.

public class HomeController : Controller
{
    public string Index()
    {
        return "Index() Action Method of HomeController";
    }
}

Теперь запустите приложение и перейдите по следующим URL-адресам, и вы увидите результат, как и ожидалось.

http://localhost:52190/
http://localhost:52190/Home

Вы также можете отобразить значения по умолчанию, используя свойство defaults, как показано ниже.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action}/{id:int?}",
                defaults: new { controller = "Home", action = "Index" });
        });
    }
}