경로 제약 조건 만들기(C#)Creating a Route Constraint (C#)

Stephen Waltherby Stephen Walther

이 자습서에서 Stephen Walther은 정규식을 사용 하 여 경로 제약 조건을 만들어 브라우저에서 경로를 검색 하는 방식을 제어 하는 방법을 보여 줍니다.In this tutorial, Stephen Walther demonstrates how you can control how browser requests match routes by creating route constraints with regular expressions.

경로 제약 조건을 사용 하 여 특정 경로와 일치 하는 브라우저 요청을 제한할 수 있습니다.You use route constraints to restrict the browser requests that match a particular route. 정규식을 사용 하 여 경로 제약 조건을 지정할 수 있습니다.You can use a regular expression to specify a route constraint.

예를 들어 Global.asax 파일에서 목록 1에 경로를 정의 했다고 가정해 보겠습니다.For example, imagine that you have defined the route in Listing 1 in your Global.asax file.

목록 1-Global.asax.csListing 1 - Global.asax.cs

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

목록 1에는 Product 라는 경로가 포함 되어 있습니다.Listing 1 contains a route named Product. 제품 경로를 사용 하 여 브라우저 요청을 목록 2에 포함 된 제품 컨트롤러에 매핑할 수 있습니다.You can use the Product route to map browser requests to the ProductController contained in Listing 2.

목록 2-Controllers\ProductController.csListing 2 - Controllers\ProductController.cs

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

제품 컨트롤러에서 노출 하는 Details () 작업은 productId 라는 단일 매개 변수를 허용 합니다.Notice that the Details() action exposed by the Product controller accepts a single parameter named productId. 이 매개 변수는 정수 매개 변수입니다.This parameter is an integer parameter.

목록 1에 정의 된 경로는 다음 Url과 일치 합니다.The route defined in Listing 1 will match any of the following URLs:

  • /Cv3/Product/23
  • /제품/7/Product/7

불행 하 게도 경로는 다음 Url과 일치 합니다.Unfortunately, the route will also match the following URLs:

  • /Product/blah/Product/blah
  • /> Apple/Product/apple

Details () 작업에는 정수 매개 변수가 필요 하기 때문에 정수 값이 아닌 다른 항목을 포함 하는 요청을 수행 하면 오류가 발생 합니다.Because the Details() action expects an integer parameter, making a request that contains something other than an integer value will cause an error. 예를 들어, 브라우저에 URL/Dva/>를 입력 하면 그림 1에 오류 페이지가 표시 됩니다.For example, if you type the URL /Product/apple into your browser then you will get the error page in Figure 1.

새 프로젝트 대화 상자 The New Project dialog box

그림 01: 페이지 분해보기 (전체 크기 이미지를 보려면 클릭)Figure 01: Seeing a page explode (Click to view full-size image)

원하는 것은 적절 한 정수 productId를 포함 하는 Url과 일치 하는 것입니다.What you really want to do is only match URLs that contain a proper integer productId. 경로를 정의할 때 제약 조건을 사용 하 여 경로와 일치 하는 Url을 제한할 수 있습니다.You can use a constraint when defining a route to restrict the URLs that match the route. 목록 3의 수정 된 제품 경로에는 정수와 일치 하는 정규식 제약 조건이 포함 되어 있습니다.The modified Product route in Listing 3 contains a regular expression constraint that only matches integers.

목록 3-Global.asax.csListing 3 - Global.asax.cs

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

정규식 \d +는 하나 이상의 정수와 일치 합니다.The regular expression \d+ matches one or more integers. 이 제약 조건으로 인해 제품 경로가 다음 Url과 일치 합니다.This constraint causes the Product route to match the following URLs:

  • /Product/3/Product/3
  • /Cv99/Product/8999

그러나 다음 Url은 그렇지 않습니다.But not the following URLs:

  • /> Apple/Product/apple

  • /Product/Product

  • 이러한 브라우저 요청은 다른 경로에 의해 처리 되거나, 일치 하는 경로가 없는 경우 리소스를 찾을 수 없습니다. 오류가 반환 됩니다.These browser requests will be handled by another route or, if there are no matching routes, a The resource could not be found error will be returned.