2013-09-03 5 views
1

부서 이름과 제품 이름을 기반으로 사용자 지정 라우팅을 원합니다. 예 :/mobiles/nokia-6303Aspnet MVC 4 라우팅 문제

제품 페이지를 호출 할 때 문제가 없습니다. 내가 컨트롤러와 액션 방법에 따라 기본적으로 홈 페이지와 같은 제품 페이지 이외의 호출 오전 때이 문제를 피하는 방법을

defaults: new { controller = "ContentPage", action = "ProductDetail" } 

를 실행? 사전 인 Rajesh

답변

0

마침내 내가 사용하여이 문제를 해결 한 부서 이름 및 제품 이름은 일부 제품과 일치하는지 여부를 확인합니다 그는 {에 DepartmentName}/{제품 이름} 경로에 대한 제약 조건을 만들기 라우팅 설정 자체는 아래의 공동을 찾아주세요 드. 내가 사용하고있는 경우 답장을 보내

foreach (var d in departmentTranslation) 
{ 
    routes.MapRoute(
    "ContentPage" + d.Name, 
    d.Name + "/{ProductName}", 
    new 
     { 
      controller = "ContentPage", 
      action = "ProductDetails", 
      id = d.DepartmentId, 
      ProductName = UrlParameter.Optional 
     }); 
} 
+0

우리는 100 개 이상의 부서를 가지고 있으며 각 부서마다 하나의 경로를 만듭니다. 이 튼튼한가? –

2

귀하의 경로에서

routes.MapRoute(
name: "ProductDetailsPage", 
url: "/{DepartmentName}/{ProductName}", 
defaults: new { controller = "ContentPage", action = "ProductDetail" } 
); 

routes.MapRoute(
name: "Default", 
url: "{controller}/{action}", 
defaults: new { controller = "Home", action = "Index" } 
); 

덕분에 정확히 동일합니다. /DepartmentName/ProductName/Controller/Action을 구별하는 것은 불가능합니다.

+0

감사합니다,/제품/{에 DepartmentName}/{제품 이름} 우리의 SEO 팀은 허용되지 않습니다. 그들은 이것이 SEO 친화적 인 URL이 아니라고 말하고 있습니다. –

+0

@ RajeshGK 음, 서로 다른 곳을 가리키는 두 개의 동일한 경로를 가질 수는 없습니다. 그것은 말이되지 않습니다. 다른 형식의 URL이 있어야합니다. 소유하고있는 또 다른 대안은 하위 도메인에 별도의 MVC 앱을 호스팅하는 것입니다. products.site.com/department/product –

+0

{DepartmentName}/{ProductName}이 (가) 일치하는지 확인하기 위해 들어오는 URL의 유효성을 검사하는 옵션이 있습니다. ProductDetailsPage 라우팅을 무시합니까? –

0

아마도 개미 P의 우수한 제안에 약간의 수정이 될 것

routes.MapRoute(
    name: "ProductDetailsPage", 
    url: "/Products/{DepartmentName}/{ProductName}", 
    defaults: new { controller = "ContentPage", action = "ProductDetail" } 
); 

을 그리고/제품 /에 DepartmentName/PRODUCTNAME로 이동 : 당신은 두 가지를 구별하기 위해 예를 들어, URL에 다른 뭔가가 필요 부서 이름과 제품 이름 사이에 텍스트를 삽입 하시겠습니까? 이후

routes.MapRoute(
    name: "ProductDetailsPage", 
    url: "/{DepartmentName}/Products/{ProductName}", 
    defaults: new { controller = "ContentPage", action = "ProductDetail" } 
); 

또는 가지고 세부 사항 :가 URL 내에서 관련 정보 soemwhat 포함되어 있기 때문에

routes.MapRoute(
    name: "ProductDetailsPage", 
    url: "/{DepartmentName}/{ProductName}/details", 
    defaults: new { controller = "ContentPage", action = "ProductDetail" } 
); 

이 URL 접근 방법의 하나는, 당신의 'SEO 팀'과거를 얻을 수 있습니다.

0

다른 답변에서 언급 한 것처럼 라우팅 시스템에서는 {controller}/{action}{DepartmentName}/{ProductName}을 구분할 수 없습니다.

constraint to a route을 추가하여이 문제를 해결할 수 있습니다. 제약 조건이 충족되지 않으면 경로가 URL과 일치하지 않습니다. 아마도 IRouteConstraint의 사용자 정의 구현을 만들어야 할 것입니다. 나는 두 가지 옵션을 참조하십시오

  • 는 {컨트롤러}의 제한을 만들기 컨트롤러 가능한 이름의 목록이 포함됩니다/{동작} 경로, 즉 기본 URL 패턴

  • 에게 사용되어야한다 데이터베이스 (또는 메모리 내 캐시)

+0

마침내 내가 라우팅 설정 자체를 사용하여이 문제를 해결했습니다, 아래에서 찾아보십시오 암호. –