login register Sysop! about ME  
qrcode
    최초 작성일 :    2012년 06월 29일
  최종 수정일 :    2012년 06월 29일
  작성자 :    Jake
  편집자 :    Jake (류 지형)
  읽음수 :    20,028

강좌 목록으로 돌아가기

필자의 잡담~

이번 컬럼은 류지형(jake)님이 번역해 주셨으며, 라우트에 제약을 적용하는 방법에 대해 설명하고 있습니다. 원문은 http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs 입니다.

이 글은 Windows Azure 공식 컬럼인 http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs 의 글을 편역한 내용입니다. 마이크로소프트의 공식 번역 문서가 아니며 태오 사이트 MS 컬럼 번역팀에서 번역한 내용입니다. 그렇기에, 일부 오역이나 오타가 존재할 수 있는 점 미리 양해를 구합니다. 원문에 대한 모든 저작권은 마이크로소프트에 있으며, 컬럼 내용과 관련한 질의 문답 역시 원문 사이트에 문의하시는 것을 추천드립니다.

MVC 라우트(Route) 제약조건 만들기

이 자습서에서 저자 스페판은 정규식을 이용한 라우트 제약조건을 만들어서 브라우저 요청과 라우트가 매칭될 때 어떻게 간섭하여 제어할 수 있는지 보여줍니다.

브라우저 요청이 특정 라우트와 매칭되는 과정을 조정하고 싶을 경우에는 라우트 제약조건(Route Constraint)을 사용하면 됩니다. 그리고, 라우트 제약조건을 정의할 때에는 정규식(Regular Expression)을 사용하면 좀더 구체적으로 명시할 수 있습니다.

예를 들어, Global.asax 파일에 목록 1 과 같이 라우트를 정의했다고 합시다.

목록 1 - Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"}
);

목록 1은 Product라는 라우트를 정의하고 있습니다. 여러분은 Product 라우트를 사용하여 브라우저의 요청을 목록 2에 정의된 ProductController로 연결(매핑)할 수 있습니다.

목록 2 - Controllers\ProductController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        public ActionResult Details(int productId)
        {
            return View();
        }
    }
}

Product 컨트롤러에 의해 노출되고 있는 Details() 액션은 productId라고 하는 한 개의 integer 매개변수를 받고 있습니다.

목록 1에 정의된 라우트는 아래와 같은 형태의 URL들과 매치됩니다.

  • /Product/23
  • /Product/7

문제는 다음과 같은 형태의 URL들과도 매치된다는 것입니다.

  • /Product/blah
  • /Product/apple

Details() 액션은 정수 형식을 기대하고 있기 때문에 정수가 아닌 형식이 브라우저 요청으로 들어오면 오류를 유발하게 됩니다. 예를 들어, URL로 /Product/apple 을 브라우저에 입력하면 그림 1과 같은 오류 페이지를 만나게 될 겁니다.


그림 1 : 오류 페이지
출처 : http://i1.asp.net/asp.net/images/mvc/24/image002.jpg

이런 오류를 피하기 위해 여러분은 정수 형식의 productId만을 포함하는 URL을 정의하고 싶을 겁니다. 이렇게 URL의 형태를 제약하기 위해서 라우트 정의 시 제약조건을 추가로 사용할 수 있습니다. 목록 3은 개선된 Product 라우트를 보여주고 있습니다. 개선된 라우트는 정수 형식만을 고려하도록 정규식을 사용하고 있습니다.

목록 3 - Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }??
);

정규식, \d+ 는 하나 또는 그 이상의 정수를 표현하기 때문에 아래와 같은 URL들과 매치됩니다.

  • /Product/3
  • /Product/8999

그러나, 정수 타입이 아닌 아래와 같은 URL들과는 매치되지 않습니다.

  • /Product/apple
  • /Product

위와 같이 정수 형식을 포함하지 않는 요청은 다른 라우트에 의해 처리되거나, 혹은 매치되는 적절한 라우트가 없을 경우에 "The resource could not be found" 라는 오류를 반환할 겁니다.


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})