2009-04-09 5 views
50

두 개 이상의 매개 변수를 사용하는 경로가있을 때 Html.ActionLink에 문제가 있습니다. 예를 들어, 내 Global.asax 파일에 정의 된 다음 경로 제공 :여러 경로 값을 사용하는 ASP.NET MVC URL 라우팅

routes.MapRoute(
    "Default",            // Route name 
    "{controller}.mvc/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

routes.MapRoute(
    "Tagging", 
    "{controller}.mvc/{action}/{tags}", 
    new { controller = "Products", action = "Index", tags = "" } 
); 

routes.MapRoute(
    "SlugsAfterId", 
    "{controller}.mvc/{action}/{id}/{slug}", 
    new { controller = "Products", action = "Browse", id = "", slug = "" } 
); 

처음 두 경로가 문제없이 작동하지만을 나는 사용하여 세 번째 행 노선의 액션 링크를 만들려고 할 때 :

<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %> 
내가// 1/URL- 세부 사항을 더 같은 [사이트 루트] 될 수있는 URL을 원하는 반면

나는 [사이트 루트]와 같은 URL/세부/1? 슬러그 = URL-슬러그와 끝까지 슬러그

Can anyon 내가 잘못 가고있는 곳을 보아라.

+2

저는 항상 이런 종류의 문제가 있었으며 컨트롤러 및 액션 이름을 하드 코딩하는 것 외에는 용인 할 수있는 해결책을 찾지 못했습니다. 많은 경로를 유도합니다. – Will

+0

당신은 ASP.NET MVC 프로젝트에 대한 편안한 라우팅을 볼 수 있습니다. http://stevehodgkiss.com/2009/10/11/restful-routes-for-asp-net-mvc.html 저는 이것을 사용하여 URL을 얻을 수 있습니다./blogs/1/posts/2/comments/3 – Paul

답변

59

완전히 만족하는 첫 번째 경로를 사용하고 있습니다. SlugsAfterId 경로를 Default 위에 올려보세요.

"기본적으로 확인하십시오. 작업을 수행 했습니까? 예, ID가 있습니까? 예,이 쿼리를 사용하여 쿼리 문자열의 다른 매개 변수를 고정하십시오."

보조 노트로 매개 변수의 기본값을 입력하면 Default 경로가 중복 될 수 있습니다.

31

게리 (위)가 정확합니다. Haack의 MVC 용 라우트 디버거를 사용할 수 있습니다. 어떤 경로에 방문했는지 알려줌으로써 라우팅 문제를 해결할 수 있습니다.

여기는 Blog Post입니다. 여기에 Zip File입니다.

+6

+1 경로 디버거에 대한 링크 - 감사합니다 –

8

"id"가 포함 된 경로에 제약 조건을 추가 할 수 있습니다. 이는 아마도 숫자 만 허용하기 때문입니다. 이렇게하면 첫 번째 경로는 "id"가 숫자 일 때만 일치하고 다른 모든 값에 대해서는 두 번째 경로를 만듭니다. 그런 다음 {slug}가 포함 된 것을 상단에 놓으면 모든 것이 올바르게 작동합니다.

routes.MapRoute(
    "SlugsAfterId", 
    "{controller}.mvc/{action}/{id}/{slug}", 
    new { controller = "Products", action = "Browse", id = "", slug = "" }, 
    new { id = @"\d+" } 
); 

routes.MapRoute(
    "Default",            // Route name 
    "{controller}.mvc/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" }, // Parameter defaults 
    new { id = @"\d+" } 
); 

routes.MapRoute(
    "Tagging", 
    "{controller}.mvc/{action}/{tags}", 
    new { controller = "Products", action = "Index", tags = "" } 
);