ASP.NET 코어 에서 사용자 정의 루트 제약 의 실현

경로 제약 조건
ASP.NET Core 에 서 는 경로 템 플 릿 을 정의 함으로써 Url 에서 변 수 를 전달 할 수 있 고 변수 에 대해 기본 값,선택 가능,제약 을 제공 할 수 있 습 니 다.
제약 의 사용 방법 은 속성 경로 에 지정 한 제약 명 을 추가 하 는 것 입 니 다.용법 은 다음 과 같 습 니 다.

//     
[Route("users/{id:int}")]
public User GetUserById(int id) { }
//     
[Route("users/{id:int:min(1)}")]
public User GetUserById(int id) { }
프레임 내부 에 제약 이 제공 되 었 습 니 다.다음 과 같 습 니 다.
구속 하 다
예시
일치 항목 예제
설명 하 다.
int
{id:int}
123456789, -123456789
모든 정수 일치
bool
{active:bool}
true, FALSE
true 나 false 와 일치 합 니 다(대소 문자 구분)
datetime
{dob:datetime}
2016-12-31, 2016-12-31 7:32pm
올 바른 DateTime 값 일치(고정 지역성 에 있 음-경고 보기)
decimal
{price:decimal}
49.99, -1,000.01
올 바른 decimal 값 일치(고정 지역성 에 있 음-경고 보기)
double
{weight:double}
1.234, -1,001.01e8
유효한 double 값 일치(고정 지역성 에 있 음-경고 보기)
float
{weight:float}
1.234, -1,001.01e8
유효한 float 값 일치(고정 지역성 에 있 음-경고 보기)
guid
{id:guid}
CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638}
유효한 Guid 값 일치
long
{ticks:long}
123456789, -123456789
유효한 long 값 일치
minlength(value)
{username:minlength(4)}
Rick
문자열 은 최소 4 글자 여야 합 니 다.
maxlength(value)
{filename:maxlength(8)}
Richard
문자열 은 8 자 를 초과 해 서 는 안 됩 니 다.
length(length)
{filename:length(12)}
somefile.txt
문자열 이 12 글자 여야 합 니 다.
length(min,max)
{filename:length(8,16)}
somefile.txt
문자열 은 최소 8 글자 여야 하 며 16 자 를 초과 해 서 는 안 됩 니 다.
min(value)
{age:min(18)}
19
정수 치 는 적어도 18 이 어야 한다.
max(value)
{age:max(120)}
91
정수 치 는 120 을 초과 해 서 는 안 된다.
range(min,max)
{age:range(18,120)}
91
전체 수 치 는 적어도 18 이 어야 하 며 120 을 초과 해 서 는 안 된다.
alpha
{name:alpha}
Rick
문자열 은 하나 이상 의 알파벳 문자(a-z,대소 문자 구분)로 구성 되 어야 합 니 다.
regex(expression)
{ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)}
123-45-6789
문자열 은 정규 표현 식 과 일치 해 야 합 니 다.(정규 표현 식 을 정의 하 는 팁 참조)
required
{name:required}
Rick
URL 생 성 과정 에서 비 매개 변수 값 이 존재 하도록 강제 합 니 다.
내 장 된 제약 은 대부분의 흔히 볼 수 있 는 응용 장면 에 적용 되 지만 가끔 은 우리 가 원 하 는 효 과 를 사용자 정의 해 야 한다.
사용자 정의 경로 제약 조건
사용자 정의 제약 조건 은 IRoute Constraint 인 터 페 이 스 를 실현 하고 Match 를 다시 불 러 오 는 방법 입 니 다.이 방법 은 네 개의 인자 가 있 습 니 다.
첫 번 째 매개 변수 http Context 는 현재 요청 한 컨 텍스트 입 니 다.
두 번 째 매개 변수 route 는 현재 제약 에 속 하 는 경로 입 니 다.
세 번 째 매개 변수 routeKey 는 현재 검사 의 변수 이름 입 니 다.예 를 들 어 글 시작 예제 의 id 입 니 다.
네 번 째 매개 변수 values 는 현재 Url 에 일치 하 는 사전 값 입 니 다.예 를 들 어 글 의 시작 에 있 는 예제 의 경로 입 니 다.Url 이 users/1 이면 하나의 사전 이 있 습 니 다.key=id,value=1.물론 다른 변수의 값 도 있다.예 를 들 어 controller,action 등 이다.
다섯 번 째 매개 변수 routeDirection 은 웹 이 요청 한 것 인지,Url.Action 등 방법 으로 Url 을 생 성 하 는 것 인 지 를 나타 내 는 매개 변수 입 니 다.
예 를 들 어 우 리 는 제약 을 정의 하려 면 경로 가 전 달 된 매개 변 수 를 지정 해 야 합 니 다.
우 리 는 먼저 매 거 진 것 을 정의 합 니 다.

public enum BoolEnum
{
  True,
  False
}
그리고 제약 조건 을 정의 합 니 다.

public class EnumConstraint : IRouteConstraint
{
  private Type _enumType;

  public EnumConstraint(string enumTypeName)
  {
    _enumType = Type.GetType(enumTypeName);
  }

  public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
  {
    var value = values[routeKey];
    if (value == null)
    {
      return false;
    }

    if (Enum.TryParse(_enumType, value.ToString(), out object result))
    {
      if (Enum.IsDefined(_enumType, result))
      {
        return true;
      }
    }

    return false;
  }
}
Startup.cs 의 Configure Services 방법 에 사용자 정의 제약 조건 을 추가 합 니 다.

services.Configure<RouteOptions>(options =>
{
  options.ConstraintMap.Add("enum", typeof(EnumConstraint));
});
경로 에서 제약 조건 사용 하기:
(WebApplicationTest 는 현재 namespace)

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
  // GET: api/Test
  [HttpGet("{bool:enum(" + nameof(WebApplicationTest) + "." + nameof(BoolEnum) + ")}")]
  public string Get(BoolEnum @bool)
  {
    return "bool: " + @bool;
  }

  [HttpGet("{id:int:min(2)}", Name = "Get")]
  public string Get(int id)
  {
    return "id: " + id;
  }

  [HttpGet("{name}")]
  public string Get(string name)
  {
    return "name: " + name;
  }
}

{id:int:min(2)}경로 가 min(2)을 사용 해 야 합 니 다.그렇지 않 으 면 id=0 또는 id=1 에 충돌 할 수 있 습 니 다.
프로그램 을 실행 합 니 다.경로 가 api/test/0,api/test/1,api/test/true 와 api/test/False 일 때 사용자 정의 제약 조건 과 일치 합 니 다.
경로 가 api/test/{2 이상 의 정수}일 때 두 번 째 경로 와 일치 합 니 다.
다른 상황 은 세 번 째 경로 와 일치 합 니 다.
결론.
경로 제약 은 특정한 장면 에서 매우 유용 한 기능 으로 contrller 에서 파 라 메 터 를 검사 하 는 것 을 줄 일 수 있 고 일부 매개 변수 검증 기능 은 성명 식 attruibute 를 사용 하여 이 루어 집 니 다.일부 중복 되 는 검 사 는 추출 을 통 해 공공 사용 을 제약 할 수 있 습 니 다.
constraint 의 구조 함 수 는 주입 을 사용 할 수 있 기 때문에 확장 성 이 매우 강하 고 데이터 베 이 스 를 조회 하여 매개 변수 검 사 를 할 수 있 습 니 다.
홈 페이지 에 서 는 경로 제약 에 대해 간단하게 언급 했 을 뿐 본 고 는 경로 제약 의 사용 에 대해 구체 적 인 예 를 제공 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기