Собственная маршрутизация в ASP.NET Core MVC
Если вы хотите определить свой собственный маршрут, вам нужно использовать промежуточное ПО 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" });
});
}
}
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.