0

Asp.NET MVC SiteMap Provider 버전 4.0이 있습니다.동일한 면도기 뷰에 대한 다중 경로 - SiteMap Provider를 사용하는 ASP.NET MVC breadcrum

몇 가지 테스트 면도기 테스트가있는 소규모 테스트 프로젝트를 작성했습니다.

<mvcSiteMapNode title="Home - default" controller="Home" action="Index"> 
    <mvcSiteMapNode title="Middle - default" controller="Home" action="Middle"> 
     <mvcSiteMapNode title="Edit - default" controller="Home" action="Edit" key="keyForEdit"> 
     </mvcSiteMapNode> 
    <mvcSiteMapNode title="Over - another path" controller="Home" action="Over"> 
     <mvcSiteMapNode title="Edit through over" controller="Home" action="Edit" canonicalKey="keyForEdit"> 
     </mvcSiteMapNode> 
    </mvcSiteMapNode> 
    </mvcSiteMapNode> 
    </mvcSiteMapNode> 
</mvcSiteMap> 

아이디어는 응용 프로그램에서 다른 장소에서 "편집"보기에 도달하는 것입니다 : 다음은 경로가 정의되고 MvcSite XML 파일입니다. 나는 "중간"또는 "오버"면도기보기를 통과 할 수 있습니다. 내 목표는 "편집"보기에 대한 다른 경로에 대해 서로 다른 bredcrumb 디스플레이를 갖는 것입니다. - 이동 경로 내에서 제목

@{ 
     Layout = null; 
    } 

    <!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>This is layout</title> 
    @Html.MvcSiteMap().CanonicalTag() 
</head> 
<body> 
    <div>Hi from Layout!</div> 
    <div>@Html.MvcSiteMap().SiteMapPath()</div> 
    <div> 
     @RenderBody() 
    </div> 
</body> 
</html> 

하지만 때마다 나는에 내가 가지고있는 "편집"보기 "기본 편집"을 얻을 : 다음은 사이트로 구축 된 마스터 레이아웃입니다. 이유가 무엇인가요? 시간 내 주셔서 대단히 감사합니다.

+0

가능한 중복 (http://stackoverflow.com/questions/19953616/mvcsitemapprovider-multiple-paths-to-the-single-page) – markpsmith

답변

2

정확히 동일한 경로 서명을 가진 2 개의 다른 노드가 있기 때문입니다. 이것이 발생하면 현재 노드 (현재 요청의 노드)를 결정할 때 첫 번째 일치가 항상 우세합니다.

예를 들어, 두 URL의 경로는 다음과 같습니다.

|-----------------------------------|-----------------------------------| 
|   Current Request   |   SiteMap Node    | 
|-----------------------------------|-----------------------------------| 
|  Key  |  Value  |  Key  |  Value  | 
|-----------------------------------|-----------------------------------| 
| controller  | Home    | controller  | Home    | 
| action   | Edit    | action   | Edit    | 
|-----------------------------------|-----------------------------------| 

문제는 두 번째 노드로 이동하는 고유 한 방법이 없으므로 절대로 일치하지 않는다는 것입니다. 또한 두 경우 모두 URL (및 경로)이 동일합니다.

이 기능이 제대로 작동하려면 경로 서명이 동일한 위치를 나타내더라도 각 노드마다 고유해야합니다. 이를 달성하는 가장 간단한 방법은 추가 매개 변수를 추가하여 다른 경로 서명을 만들고 사례 중 하나에 대해 다른 URL을 만드는 것입니다.

<mvcSiteMapNode title="Home - default" controller="Home" action="Index"> 
    <mvcSiteMapNode title="Middle - default" controller="Home" action="Middle"> 
     <mvcSiteMapNode title="Edit - default" controller="Home" action="Edit" key="keyForEdit"/> 
    </mvcSiteMapNode> 
    <mvcSiteMapNode title="Over - another path" controller="Home" action="Over"> 
     <mvcSiteMapNode title="Edit through over" controller="Home" action="Edit" category="path2" canonicalKey="keyForEdit"/> 
    </mvcSiteMapNode> 
</mvcSiteMapNode> 

기본 경로를 사용하여 첫 번째 편집 페이지의 URL /Home/Edit을 생성하고, 두 번째는 URL /Home/Edit?category=path2를 생성합니다. 이렇게하면 MvcSiteMapProvider가 두 위치 간의 차이를 알 수있는 충분한 정보를 얻을 수 있습니다. 이제 두 번째 모습이 보입니다. 현재 요청 경로 카테고리 = 경로 2를 포함 그럼 언제

|-----------------------------------|-----------------------------------| 
|   Current Request   |   Default Node    | 
|-----------------------------------|-----------------------------------| 
|  Key  |  Value  |  Key  |  Value  | 
|-----------------------------------|-----------------------------------| 
| controller  | Home    | controller  | Home    | 
| action   | Edit    | action   | Edit    | 
| category  | path2   |         | 
|-----------------------------------|-----------------------------------| 


|-----------------------------------|-----------------------------------| 
|   Current Request   |  Another Path Node   | 
|-----------------------------------|-----------------------------------| 
|  Key  |  Value  |  Key  |  Value  | 
|-----------------------------------|-----------------------------------| 
| controller  | Home    | controller  | Home    | 
| action   | Edit    | action   | Edit    | 
| category  | path2   | category  | path2   | 
|-----------------------------------|-----------------------------------| 

는, 지금 현재 노드를 찾을 때 두 번째 노드와 일치하고 있기 때문에 추가 매개 변수의 첫 번째 일치되지 않습니다.

경로를 정렬하여 원하는 모든 구성표를 준수하는 URL을 만들 수도 있습니다. 유일한 한계는 각 노드의 경로가 고유해야한다는 것입니다.

예제 및 다운로드 가능한 데모 프로젝트는 MvcSiteMapProvider - SEO Features Tutorial입니다. 또한 맞춤 URL 체계를 사용하려는 경우 How to Make MvcSiteMapProvider Remember a User's Position을 검토하면 도움이 될 수 있습니다. [단일 페이지 Mvcsitemapprovider 여러 경로]의

+0

죄송합니다, 나는 시도했지만 아직도 일. 나는 sth하고있다. 잘못된? 노드 "편집"을 통해 "범주"를 추가했습니다. –

+0

SEO 기능 자습서에 대한 [데모 프로젝트] (https://github.com/NightOwl888/MvcSiteMapProvider-SEO-Features-Tutorial/archive/master.zip)를보십시오.'정보'및 '다른 정보'는 동일한 컨트롤러 작업을 가리키고 있지만 이동 경로가 다릅니다. 그 데모는 1234 =를 사용하지만 URL이 고유 한 한 고유 한 URL을 어떻게 만드는지는 중요하지 않습니다. – NightOwl888

+0

프로젝트 내부에서 작동하지만 내 프로젝트에서 복제 할 때 작동하지 않습니다. NuGet을 통해 MVCSiteProvider 4를 추가했습니다. 또한 MVC sitemap xml 및 SiteMap.Path 및 CanonocalTag에 대한 매개 변수를 레이아웃 파일에 추가했습니다. RouteCongfig 파일에 아래 줄을 추가했습니다. MvcSiteMapProvider.Web.Mvc.XmlSiteMapController.RegisterRoutes (routes); 다른 것이 있습니까? 감사합니다. –