2014-02-21 3 views
3

나는이 맵이MVCSiteMapProvider의 이동 경로가 잘못 부모 노드 ID

Projects > Project > Session 

을하지만 프로젝트 링크하는 프로젝트 세부 정보 페이지로 이동하여 세션과 동일한 ID를 사용하지만 출처는 프로젝트가 아닙니다.

inheritedRouteParameters="id"을 세션 세부 정보 페이지에 추가했지만 아무 것도 변경하지 않았습니다.

편집 : 나는 다른 preservedRouteParameters을 추가하지만, ID없이 다시/프로젝트/세부 지금 "프로젝트"링크 첨부.

답변

3

preservedRouteParameters는 키 이름이 일치하면 항상 현재 요청의 값을 복사하지만 "id"가 무엇인지에 대한 가정은하지 않습니다. 따라서 동시에 표시되는 2 개의 노드에서 preservedRouteParameters에 "id"를 사용하는 경우 동일한 의미를 갖고 있는지 확인해야합니다.

각 사례별로 다른 키 이름 (예 : 'projectId'및 'sessionId')을 사용하는 것이 좋습니다. 그런 다음 자식 노드에서 둘 다 유지할 수 있으므로 자식 노드가 속한 부모를 "기억"하게됩니다.

<mvcSiteMapNode title="Project" controller="Projects" action="Details" preservedRouteParameters="projectId"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" preservedRouteParameters="projectId,sessionId"> 
이 부모 ID가의 경로의 일부 (보통 URL)해야 작동하기 위해서는 당신이 당신의 요구 사항을 수용 할 수 있습니다 URL을 만들기 위해 얻을 수 있도록 경로를 수정해야 할 수 있지만,

자식 노드. 위의 노드 구성과 일치하는 예제가 있습니다.

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "SessionRoute", 
      url: "Project/{projectId}/{sessionId}", 
      defaults: new { controller = "Sessions", action = "Details" }); 

     routes.MapRoute(
      name: "ProjectRoute", 
      url: "Project/{projectId}", 
      defaults: new { controller = "Projects", action = "Details" }); 

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

는 MvcSiteMapProvider-강제-A-경기 - 2 레벨에서보세요이 작업을 수행 할 수있는 방법을 정확하게 볼 수 in this demo 전망이다. 경로 추가는 선택 사항입니다. URL에서 쿼리 문자열 매개 변수를 사용하지 않으려면 항상 기본 경로를 사용할 수 있습니다.

이것이 맞지 않는다면 하나의 노드 매개 변수에 preservedRouteParmeters를 사용하여 다른 매개 변수를 명시 적으로 설정하여 결합 할 수 있습니다.

<mvcSiteMapNode title="Project" controller="Projects" action="Details" preservedRouteParameters="projectId"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="1" preservedRouteParameters="projectId"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="2" preservedRouteParameters="projectId"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="3" preservedRouteParameters="projectId"> 

또는 "id"의 각 조합에 대해 노드를 만들 수 있습니다. 지난 2 개 옵션의

<mvcSiteMapNode title="Project" controller="Projects" action="Details" id="1"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="1"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="2"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="3"> 
</mvcSiteMapNode> 
<mvcSiteMapNode title="Project" controller="Projects" action="Details" id="2"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="4"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="5"> 
    <mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="6"> 
</mvcSiteMapNode> 

, 그것은 XML에 그들 모두를 마크 업보다는 동적 데이터를 채울 DynamicNodeProvider를 사용하는 것이 가장 좋습니다.

이러한 방법으로 더 깨끗한 URL을 만들 수 있지만 더 많은 RAM을 사용합니다. 일반적으로 관리 페이지의 경우 약간 엉성한 URL (preservedRouteParmaters)을 사용하고 검색 엔진 색인 생성이 필요한 페이지의 경우 동적 노드 (및 RAM)를 사용하여 저장하는 것이 좋습니다.

inheritedRouteParameters는 XML 구성에서 상위 노드의 값을 상속하는 데 사용되며 요청 수준에서는 효과가 없습니다.

현재 - 각 노드에 고유 한 경로 값 조합이 있는지 확인해야합니다.귀하의 예에서 첫 번째 노드는 정확히 동일한 경로 값을 가지므로 첫 번째 일치가 항상 이기기 때문에 두 번째 노드는 결코 일치하지 않습니다.

+0

기본 라우팅 및 다른 컨트롤러를 사용하기 때문에 preservedRouteParameters 솔루션이 작동하지 않습니까? – Shawn

+0

정말 라우팅과 관련이 없습니다. 두 개의 다른 노드에서 동시에 표시 할 수있는 매개 변수에 동일한 이름을 사용하고 있기 때문입니다. preservedRouteParameters는 여러 요청에서 ID를 기억하지 못하고 현재 ID 만 복사합니다. 다른 목적으로 동일한 ID를 사용하는 조상 노드가있는 경우 자식 노드를 볼 때 잘못된 ID를 사용합니다. – NightOwl888

+0

preservedRouteParameters가 어떻게 작동하는지 더 잘 이해하려면이 글을 읽어보십시오. http://www.shiningtreasures.com/post/2013/09/02/how-to-make-mvcsitemapprovider-remember-a-user-position – NightOwl888