수색…


소개

라우팅은 ASP.NET MVC가 URI를 작업과 일치시키는 방법입니다. 라우팅 모듈은 들어오는 브라우저 요청을 특정 MVC 컨트롤러 작업에 매핑합니다.

MVC 5는 속성 라우팅이라고하는 새로운 유형의 라우팅을 지원합니다. 이름에서 알 수 있듯이 속성 라우팅은 속성을 사용하여 경로를 정의합니다. 속성 라우팅을 사용하면 웹 응용 프로그램의 URI를보다 잘 제어 할 수 있습니다.

맞춤 라우팅

사용자 지정 라우팅은 특정 들어오는 요청을 처리하기 위해 라우팅이 특수하게 필요합니다.

맞춤 경로를 정의하려면 경로 표에 추가하는 경로의 순서가 중요해야합니다.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
    // this is an advanced custom route
    // you can define custom URL with custom parameter(s) point to certain action method
    routes.MapRoute(
    "CustomEntry", // Route name
    "Custom/{entryId}", // Route pattern
    new { controller = "Custom", action = "Entry" } // Default values for defined parameters above
    );

    // this is a basic custom route
    // any custom routes take place on top before default route
    routes.MapRoute(
    "CustomRoute", // Route name
    "Custom/{controller}/{action}/{id}", // Route pattern
    new { controller = "Custom", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
    );

    routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // Route pattern
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
    );
}

controlleraction 이름은 예약되어 있습니다. 기본적으로 MVC는 URL의 {controller} 부분을 <controller>Controller 클래스에 매핑 한 다음 접미사를 추가하지 않고 <action> 이름의 메서드를 찾습니다.

{controller}/{action}/{parameter} 템플릿을 사용하여 라우트 패밀리를 만드는 것이 유혹적 일지 모르지만 {controller}/{action}/{parameter} 의 이름을 변경하면 애플리케이션의 구조를 변경하고 URL을 다소 취약하게 만듭니다. 사용자가 저장 한 링크를 라우팅하고 끊습니다.

명시적인 경로 설정 선호 :

routes.MapRoute(
    "CustomRoute", // Route name
    "Custom/Index/{id}", // Route pattern
    new { controller = "Custom", action = nameof(CustomController.Index), id = UrlParameter.Optional }
);

(추가 접미어 Controller 가 있으므로 제어기 이름에는 nameof 연산자를 사용할 수 없습니다). 경로에서 제어기 이름을 설정할 때 생략해야합니다.

Mvc에서 사용자 정의 경로 추가하기

사용자는 컨트롤러의 특정 동작에 URL을 매핑하여 맞춤 경로를 추가 할 수 있습니다. 이것은 검색 엔진 최적화 목적으로 사용되며 URL을 읽을 수있게합니다.

routes.MapRoute(
  name: "AboutUsAspx", // Route name
  url: "AboutUs.aspx",  // URL with parameters
  defaults: new { controller = "Home", action = "AboutUs", id = UrlParameter.Optional }  // Parameter defaults
);

MVC의 속성 라우팅

경로 정의의 고전적인 방법과 함께 MVC WEB API 2와 MVC 5 프레임 워크가 소개되었습니다. Attribute routing :

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
        // This enables attribute routing and must go  before other routes are added to the routing table.
        // This makes attribute routes have higher priority
        routes.MapMvcAttributeRoutes();  
    }
}

컨트롤러 내에서 동일한 접두사가있는 경로의 경우 RoutePrefix 특성을 사용하여 컨트롤러 내부의 전체 동작 메서드에 대한 공통 접두사를 설정할 수 있습니다.

[RoutePrefix("Custom")]
public class CustomController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    {
        ...
    }
}

RoutePrefix 는 선택적이며 컨트롤러의 모든 동작 앞에 접두사가 붙은 URL 부분을 정의합니다.

여러 경로가있는 경우 기본 경로를 매개 변수로 캡처하여 기본 경로를 설정 한 다음 기본 경로를 재정의하는 특정 동작 방법에 특정 Route 특성이 정의되어 있지 않으면 전체 컨트롤러에 적용 할 수 있습니다.

[RoutePrefix("Custom")]
[Route("{action=index}")]
public class CustomController : Controller
{
    public ActionResult Index()
    {
        ...
    }

    public ActionResult Detail()
    {
        ...
    }
}

라우팅 기본 사항

브라우저를 통해 yourSite/Home/Index url을 요청하면 라우팅 모듈은 HomeController 클래스의 Index 액션 메소드로 요청을 yourSite/Home/Index . 이 특정 클래스의 특정 메소드에 요청을 보내는 것을 어떻게 알 수 있습니까? RouteTable이 제공됩니다.

모든 응용 프로그램에는 경로 패턴과 요청을 보낼 위치에 대한 정보가 저장되는 경로 테이블이 있습니다. 따라서 mvc 응용 프로그램을 만들 때 라우팅 테이블에 이미 등록 된 기본 경로가 있습니다. RouteConfig.cs 클래스에서이를 볼 수 있습니다.

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   routes.MapRoute("Default", "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}

엔트리에 이름과 템플릿이 있음을 알 수 있습니다. 템플리트는 요청이 들어올 때 점검 할 라우트 패턴입니다. 기본 템플리트에는 제어기 URL 세그먼트의 값으로 Home 이 있고 조치 세그먼트의 값으로 Index 가 있습니다. 즉, 요청에 컨트롤러 이름과 동작을 명시 적으로 전달하지 않으면 이러한 기본값이 사용됩니다. 이것이 귀하의 yourSite/Home/IndexyourSite 액세스 할 때 동일한 결과를 얻는 이유입니다

id라는 매개 변수가 경로 패턴의 마지막 세그먼트임을 알 수 있습니다. 그러나 기본값에서는 선택적이라는 것을 명시합니다. 그게 우리가 시도한 URL을 id 값으로 지정하지 않아도 된 이유입니다.

이제 HomeController의 Index 액션 메소드로 돌아가서 매개 변수를 추가하십시오.

public ActionResult Index(int id)
{
     return View();
}

이제이 방법에 시각적 인 스튜디오 중단 점 을 넣으십시오. 프로젝트를 실행하고 브라우저에서 yourSite/Home/Index/999 에 액세스하십시오. 중단 점이 발생하고 id 매개 변수에서 999 값을 사용할 수 있음을 알 수 있습니다.

두 번째 경로 패턴 만들기

우리가 다른 라우트 패턴에 대해 동일한 액션 메소드가 호출되도록 설정하려고한다고 가정 해 봅시다. 새로운 경로 정의를 경로 테이블에 추가하여이를 수행 할 수 있습니다.

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   
   // New custom route definition added
   routes.MapRoute("MySpecificRoute",
    "Important/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

   //Default catch all normal route definition
   routes.MapRoute("Default", "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}

내가 추가 한 새로운 정의에는 Important/{id} 패턴이 있습니다. 여기서 id는 다시 선택 사항입니다. 즉, yourSiteName\Important 또는 yourSiteName\Important\888 을 요청하면 HomeController의 색인 작업으로 전송됩니다.

노선 정의 등록 순서

경로 등록 순서가 중요합니다. 일반적인 기본 경로 앞에 항상 특정 경로 패턴을 등록해야합니다.

캐치 올 경로

언 바운드 번호를 허용하는 경로가 필요하다고 가정 해 보겠습니다.

일반적으로 경로 테이블의 끝에 다음과 같이 모든 요청을 잡을 수있는 경로를 추가해야합니다.

routes.MapRoute("Final", "Route/{*segments}",
      new { controller = "Product", action = "View" });

컨트롤러에서이 문제를 처리 할 수있는 액션은 다음과 같습니다.

public void ActionResult View(string[] segments /* <- the name of the parameter must match the name of the route parameter */)
{
    // use the segments to obtain information about the product or category and produce data to the user
    // ...
}

클라이언트 측 라우팅을 가능하게하는 포괄적 인 경로

단일 페이지 응용 프로그램 (SPA)의 상태를 URL로 인코딩하는 것이 좋습니다.

my-app.com/admin-spa/users/edit/id123

이를 통해 응용 프로그램 상태를 저장하고 공유 할 수 있습니다.
사용자가 브라우저의 주소 표시 줄에 url을 입력하면 서버에 들어가는 것은 요청 된 URL의 클라이언트 측 부분을 무시해야합니다. 정적 html 파일 대신 렌더링 된 면도기 뷰 (컨트롤러의 동작을 호출 한 결과)로 SPA를 제공하는 경우 catch-all 경로를 사용할 수 있습니다.

public class AdminSpaController
{
    [Route("~/admin-spa/{clienSidePart*}")]
    ActionResult AdminSpa()
    {
        ...
    }
}

이 경우 서버는 SPA 만 반환하고 경로에 따라 자체를 초기화합니다. 이 접근 방식은 url-rewrite 모듈에 의존하지 않으므로보다 유연합니다.

영역의 속성 라우팅

영역에서 속성 라우팅을 사용하려면 등록 영역과 [RouteArea(...)] 정의가 필요합니다.

RouteConfig.cs :

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();
        AreaRegistration.RegisterAllAreas();
    }
}

샘플 영역 컨트롤러 속성 라우팅 정의에서 :

[RouteArea("AreaName", AreaPrefix = "AreaName")]
[RoutePrefix("SampleAreaController")]
public class SampleAreaController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    {
        return View();
    }
}

영역에서 Url.Action 링크를 사용하는 경우 :

@Url.Action("Index", "SampleAreaController", new { area = "AreaName" })


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow