참조문서 : https://www.tektutorialshub.com/asp-net-core/asp-net-core-route-constraints/
Route 제약조건을 추가할 수 있는 방법은 2가지이다.
- Inline with the URL Parameter
- 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에 접근하면 안되는 값들을 제한하기 위해서 사용할 수도 있다.
'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 |
댓글