수색…
소개
라우팅은 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
);
}
controller
및 action
이름은 예약되어 있습니다. 기본적으로 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/Index
및 yourSite
액세스 할 때 동일한 결과를 얻는 이유입니다
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의 색인 작업으로 전송됩니다.
노선 정의 등록 순서
경로 등록 순서가 중요합니다. 일반적인 기본 경로 앞에 항상 특정 경로 패턴을 등록해야합니다.
캐치 올 경로
언 바운드 번호를 허용하는 경로가 필요하다고 가정 해 보겠습니다.
- http://example.com/Products/ (모든 제품보기)
- http://example.com/Products/IT
- http://example.com/Products/IT/Laptops
- http://example.com/Products/IT/Laptops/Ultrabook
- http://example.com/Products/IT/Laptops/Ultrabook/Asus
- 기타
일반적으로 경로 테이블의 끝에 다음과 같이 모든 요청을 잡을 수있는 경로를 추가해야합니다.
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" })