본문 바로가기
ASP.NET Core

ASP.NET Core 6] Route Constraints 경로 제약 조건

by Fastlane 2022. 1. 25.
728x90
반응형

참조문서 : https://www.tektutorialshub.com/asp-net-core/asp-net-core-route-constraints/

Route 제약조건을 추가할 수 있는 방법은 2가지이다.

  1. Inline with the URL Parameter
  2. MapRoute 함수의 Constraint argument를 사용

Route Constraints

Program.cs

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

HomeController.cs

public string Index(int id)
{
    return "I got" + id.ToString();
}

/Home/Index/test로 url을 요청했을 때, router는 test를 0으로 parsing해서 parameter로 전달한다. 

이런 일을 방지하기 위해서 id URL parameter에 data type과 범위를 지정해서 Route Constraint를 추가할 수 있다. 

id로 integer만 넘길 수 있도록 제한을 추가해보자

1) Inline Constraint

Inline Constraint는 URL Parameter 뒤에 : sign을 붙인다. 

Program.cs

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id:int?}");

또는 Attribute Routing에 추가할 수도 있다. 

HomeController.cs

[Route("/")]
[Route("Home/Index/{id:int?}")]
public string Index(int id)
{
    return "I got" + id.ToString();
}

2) MapRoute 함수의 Constraint argument를 사용

Program.cs

using Microsoft.AspNetCore.Routing.Constraints;

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}",
    constraints : new { id = new IntRouteConstraint() });

/Home/Index/test로 url을 요청했을 때, router는 404 error를 반환한다. 

언제 Route Constraints를 사용해야 하는가?

제약조건은 input validation으로 사용할 수 있지만, input validation을 위해서 존재하는 기능은 아니다. 

input validation이 route constraints로 처리된다면 client는 404 error만 받게된다. 대신에 Controller는 input을 validate하고 적절한 error message를 user에서 보내야 한다. 

 

Route Constraints는 Routing Engine이 비슷한 route를 구분할 수 있도록 돕는데 사용해야 한다. 

Program.cs

app.MapControllerRoute(name: "postId",
                pattern: "post/{id:int}",
                defaults: new { controller = "Home", action = "PostsByID" });

app.MapControllerRoute(name: "postName",
                pattern: "post/{id:alpha}",
                defaults: new { controller = "Home", action = "PostsByPostName" });

HomeController.cs

public string PostsByID(int id)
{
    return "PostsByID got" + id.ToString();
}

public string PostsByPostName(string id)
{
    return "PostsByPostName got" + id.ToString();
}

공용 내장 라우트 제약조건

Constraint Example Use
int {id:int} Only integer values allowed
Similarly other built-in datatypes like decimal, float, double, datetime, bool, long, guid can also be used as constraints
alpha {firstName:alpha} String must contain only alphabets
minlength(value) {firstName:minlength(5)} String must be at least 5 characters
maxlength(value) {firstName:maxlength(10)} String must not be more than 10 characters
length(min,max) {firstName:length(5,10)} String must be at least 5 and not more than 10 characters in length
length(length) {firstName:length(10)} String must be exactly 10 characters in length
min(value) {id:min(1)} Integer value must be at least 1
max(value) {id:max(100)} Integer value must not be more than 100
range(min,max) {id:range(1,100)} Integer value must be between 1 and 100 (inclusive)
regex(expression) String must match the pattern specified by the regular expression

정규식 라우트 제약조건

app.MapControllerRoute(name: "default",
                pattern: "{controller}/{action}/{year:regex(^\\d{{4}}$)}",
                defaults: new { controller = "Home", action = "Index" });

정규식에 사용된 이스케이프 문자 예를들어, \,{,},[,] 는 2번씩 추가해야 한다. 

따라서 ^\d{4}$ 정규식은 ^\\d{{4}}$ 이렇게 작성해야 한다. 

 

제약조건 여러개 조합

여러개 제약조건은 : 을 사용해서 조합할 수 있다. 

"/{id:alpha:minlength(6)?}"

또는 MapRoute의 Constraints 함수를 사용한다. 

app.MapControllerRoute(name: "postName",
                pattern: "post/{id:alpha}",
                defaults: new { controller = "Home", action = "PostsByPostName" },
                constraints: new
                {
                    id = new CompositeRouteConstraint(
                    new IRouteConstraint[] {
                    new AlphaRouteConstraint(),
                    new MinLengthRouteConstraint(6)
                    })
                });

요약

Route Constraints는 비슷한 route의 구별하기 위한 option으로 사용하기 좋다. 또한 controller에 접근하면 안되는 값들을 제한하기 위해서 사용할 수도 있다. 

728x90
반응형

'ASP.NET Core' 카테고리의 다른 글

ASP.NET Core] Input Tag Helper  (0) 2022.01.25
ASP.NET Core] Tag Helper  (0) 2022.01.25
ASP.NET Core 6] ASPNETCORE_ENVIRONMENT  (0) 2022.01.20
ASP.NET Core 6] 환경변수에서 ConnectionString 관리  (0) 2022.01.20
ASP.NET Core] Configuration  (0) 2022.01.20

댓글