2016-06-09 3 views
0

performance benefits 때문에 UrlHelper.Action의 모든 인스턴스를 내 코드에서 UrlHelper.RouteUrl으로 바꿔야합니다. 문서에 따르면 두 방법 모두 정규화 된 URL을 생성하므로 정확히 같은 URL을 반환 할 것임을 확인하고 싶습니다. RouteConfig에서 다음 경로를 감안할 때UrlHelper.Action은 UrlHelper.RouteUrl과 같습니다.

:


예 : RouteConfig의 경로 고유 controller, action 조합이 있다고 가정

routes.MapRoute(
    "RouteName", 
    "Url", 
    new { controller = "Controller", action = "Action" } 
); 

는하는 것이 안전한가요 가정하면

당신이 당신의 가정에서 안전 할 것

urlHelper.Action("Action", "Controller", routeValueDictionary); 

에서 생성 된 경로를 일치시킬 수 있습니다 귀하의 표시지도 위에 매핑 된 경로가없는되면

urlHelper.Action("Action", "Controller", routeValueDictionary); 

urlHelper.RouteUrl("RouteName", routeValueDictionary); 

답변

1

정확히 동일합니다 경로 이름을 사용합니다.

:

routes.MapRoute(
    "AnotherRouteName", 
    "{controller}/blah/{action}", 
    new { controller = "Controller", action = "Action" } 
); 

routes.MapRoute(
    "RouteName", 
    "Url", 
    new { controller = "Controller", action = "Action" } 
); 

... 다음 첫 번째 경로가

urlHelper.Action("Action", "Controller", routeValueDictionary); 

UPDATE .. 일치 될

예를 들어 당신이 다음과 같이 정의 된 두 개의 경로가 있다면 ... 소스를 보면 UrlHelper

내부적으로 같은 방법으로 동일한 오버로드를 관련 인수로 호출하고 있습니다.

public virtual string Action(string actionName, string controllerName, object routeValues) 
{ 
    return GenerateUrl(null /* routeName */, actionName, controllerName, TypeHelper.ObjectToDictionary(routeValues)); 
} 

public virtual string Action(string actionName, string controllerName, RouteValueDictionary routeValues) 
{ 
    return GenerateUrl(null /* routeName */, actionName, controllerName, routeValues); 
} 

//...other code removed for brevity 

public virtual string RouteUrl(string routeName, object routeValues, string protocol) 
{ 
    return GenerateUrl(routeName, null /* actionName */, null /* controllerName */, protocol, null /* hostName */, null /* fragment */, TypeHelper.ObjectToDictionary(routeValues), RouteCollection, RequestContext, false /* includeImplicitMvcValues */); 
} 

너무 많은 코드가 여기에 게시됩니다. 후드 아래에서 어떤 일이 일어나고 있는지 더 잘 이해할 수 있도록 수업 소스를 살펴보십시오.

더 이상 자세한 내용을 제공 할 수 없습니다. 나는 소스 코드로 다시 돌아갔다.

+0

사실, 내 경로에는 고유 한 '컨트롤러'와 '액션'콤보가 있다고 가정하면 '동작'과 'RouteUrl'은 정확히 동일할까요? –

+0

은 동일한 경로 값을 가지고 있음 – Nkosi

0

아니요, 정확하게는 아닙니다.

urlHelper.RouteUrl은 경로에 추가 필터 만 추가합니다. 일치하는 매개 변수 (controlleraction 포함)를 제공해야하며 그렇지 않으면 예상되는 URL 대신 null을 반환합니다.

urlHelper.RouteUrl("RouteName", 
    new { controller = "Controller", action = "Action"[, other route values... ]); 

주요 차이점이 필터는 라우팅 프레임 워크 체크 하나 경로 대신 경로의 모든 순서를 만들 것입니다.이렇게하면 URL을 생성 할 때 잘못된 경로를 일치시킬 수 없지만 들어오는 요청은 잘못된 순서로 경로 테이블에 입력하여 잘못된 경로와 일치 할 수 있습니다. 즉 경로 테이블에서 URL을 생성 할 수없는 경우가 있습니다 실제로 응용 프로그램에서 액세스 할 수 있습니다.

경로 테이블에 수천 개의 경로가 없으면 성능 차이가 눈에 띄지 않습니다.

실제 이점이 있는지 여부는 의문입니다. 사실 ActionRouteUrl은 모두 UrlHelper에서 정확히 동일한 메소드를 호출하여 URL을 생성합니다. Action 또는 RouteUrl을 사용하여 URL을 생성하든 수신 경로가 원하는 경로와 일치하는지 확인하고 올바른 경로 값 집합을 반환하려면 여전히 make unit tests이어야합니다. 당신이 경로 이름으로 null을 통과 (또는 경로 이름없이 과부하 전화) 당신이하지 않고 그것을 경로 값의 기성품 세트를 전달할 수 있습니다, 수 -

RouteUrlAction는하지 않는다는 장점을 가지고있다 controlleraction에 대한 별도의 매개 변수를 명시 적으로 설정하십시오. 따라서 RouteUrl은 정확히 Action과 같은 역할을하지만 경로 값을 동적으로 조작하는 코드와 통합하기가 더 쉽습니다.

urlHelper.RouteUrl(routeValueDictionary); 
+0

RouteUrl에는 [overload]가 있습니다 (https://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.routeurl%28v=vs.118). % 29.aspx # M : System.Web.Mvc.UrlHelper.RouteUrl % 28System.String, System.Web.Routing.RouteValueDictionary % 29),'controller'와'action'을 제외 할 수 있습니다. 그러나 그렇습니다. 두 URL 모두 동일한 URL을 생성하므로이를 확인하기 위해 단위 테스트를 만들어야합니다. 나는'null' 경로 이름 팁을 편리하게 유지할 것이다, 고마워. –