728x90
반응형
Controller는 Routing middleware를 사용하여 url을 actions에 매핑한다.
Program.cs 또는 attributes로 정의한다.
conventional routing 설정
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
MapControllerRoute는 default route를 만든다.
위의 소스를 아래와 같이 변경할 수도 있다.
app.MapDefaultControllerRoute();
Multiple conventional routes
app.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
app.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
blog route는 언제나 BlogController.Article action으로 매핑된다.
/Blog, /Blog/Article, /Blog/{any-string}은 블로그 경로와 일치하는 유일한 url 경로이다.
blog route는 default route보다 먼저 추가 되기 때문에 우선 순위가 높다.
Attribute routing for REST APIs
app.MapControllers();
[Route("[controller]/[action]")]
public class HomeController : Controller
{
[Route("~/")]
[Route("/Home")]
[Route("~/Home/Index")]
public IActionResult Index()
{
return ControllerContext.MyDisplayRouteInfo();
}
public IActionResult About()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
Attribute routing with Http verb attributes
[Route("api/[controller]")]
[ApiController]
public class Test2Controller : ControllerBase
{
[HttpGet] // GET /api/test2
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")] // GET /api/test2/xyz
public IActionResult GetProduct(string id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int/{id:int}")] // GET /api/test2/int/3
public IActionResult GetIntProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int2/{id}")] // GET /api/test2/int2/3
public IActionResult GetInt2Product(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
attribute routing의 반복을 줄이기 위해, controller의 route attribute는 controller안의 모든 개별 action의 route attributes와 결합한다. 하지만, / 또는 ~/ 로 시작하는 action의 route attribute는 controller의 route attribute와 결합하지 않는다.
Custom route attributes using IRouteTemplateProvider
IRouteTemplateProvider를 구현하여, 템플릿, 순서, 이름으로 경로를 지정한다.
public class MyApiControllerAttribute : Attribute, IRouteTemplateProvider
{
public string Template => "api/[controller]";
public int? Order => 2;
public string Name { get; set; } = string.Empty;
}
[MyApiController]
[ApiController]
public class MyTestApiController : ControllerBase
{
// GET /api/MyTestApi
[HttpGet]
public IActionResult Get()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
위의 get 메서드는 Order=2, Template = api/MyTestApi를 반환한다.
URL 생성
IUrlHelper로 URL을 생성할 수 있다. controller, view, view component에서 Url property로 사용할 수 있다.
public class UrlGenerationController : Controller
{
public IActionResult Source()
{
// Generates /UrlGeneration/Destination
var url = Url.Action("Destination");
return ControllerContext.MyDisplayRouteInfo("", $" URL = {url}");
}
}
public IActionResult Index()
{
//Generates /Products/Buy/17?color=red
var url = Url.Action("Buy", "Products", new { id = 17, color = "red" });
return Content(url!);
}
Absolute Url :
public IActionResult Index2()
{
var url = Url.Action("Buy", "Products", new { id = 17 }, protocol: Request.Scheme);
// Returns https://localhost:5001/Products/Buy/17
return Content(url!);
}
728x90
반응형
'ASP.NET Core' 카테고리의 다른 글
ASP.NET Core MVC 6] UserManager, SignInManager을 이용한 회원가입, 로그인 (0) | 2022.01.12 |
---|---|
ASP.NET Core MVC 6] Identity (0) | 2022.01.12 |
ASP.NET Core MVC] ViewData, [ViewData] attribute, ViewBag (0) | 2022.01.10 |
ASP.NET Core]Partial Views VS View Components (0) | 2022.01.07 |
ASP.NET Core] Model Validation Check (0) | 2021.12.31 |
댓글