본문 바로가기
ASP.NET Core

ASP.NET Core MVC] Routing 라우팅

by Fastlane 2022. 1. 11.
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
반응형

댓글