2009-07-02 5 views
3

이 게시물을 더 간단하게 만들기 위해 다시 작성했습니다. this의 변형 된 버전입니다SiteMap HtmlHelper ASP.NET MVC

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Runtime.CompilerServices; 
using System.Web.Mvc; 
using System.Text; 

using System.Web.Routing; 

namespace Intranet.Helpers 
{ 
    public static class MenuHelper 
    { 
    private static string GetBackLink(SiteMapNode parentNode) 
    { 
     return "<li class='li-back'><a href='" + parentNode.Url + "' title='" + parentNode.Title + "'></a></li>"; 
    } 

    public static string Menu(this HtmlHelper helper) 
    { 
     var sb = new StringBuilder(); 
     SiteMapNodeCollection siteMapNodeCollection; 
     sb.Append("<ul>"); 
     SiteMapNode currentNode = SiteMap.CurrentNode; 

     if (!SiteMap.CurrentNode.Equals(SiteMap.RootNode)) 
     { 
     if (!SiteMap.CurrentNode.HasChildNodes) 
      sb.Append(GetBackLink(SiteMap.CurrentNode.ParentNode.ParentNode)); 
     else 
      sb.Append(GetBackLink(SiteMap.CurrentNode.ParentNode)); 
     } 

     if (!SiteMap.CurrentNode.HasChildNodes) 
     siteMapNodeCollection = SiteMap.CurrentNode.ParentNode.ChildNodes; 
     else 
     siteMapNodeCollection = SiteMap.CurrentNode.ChildNodes; 

     foreach (SiteMapNode node in siteMapNodeCollection) 
     { 
     if(node.Description.Equals("hidden")) continue; 

     if (node.Url.Length == 0 && node.Description.Equals("separator")) 
      sb.Append("<li class=\"li-separator\"></li>"); 
     else if (node.Url.Length == 0 && node.Description.Equals("heading")) 
      sb.Append("<li class=\"li-heading\">" + node.Title + "</li>"); 
     else 
     { 
      if (node.HasChildNodes) 
      { 
      if (node.NextSibling != null) 
       sb.Append("<li class=\"li-sub\"><a href=\"" + node.Url + "\">" + node.Title + "</a></li>"); 
      else 
       sb.Append("<li class=\"li-sub last-child\"><a href=\"" + node.Url + "\">" + node.Title + "</a></li>"); 
      } 
      else 
      { 
      if (node.NextSibling != null) 
       sb.Append("<li><a href='" + node.Url + "'>" + node.Title + "</a></li>"); 
      else 
       sb.Append("<li class='last-child'><a href='" + node.Url + "'>" + node.Title + "</a></li>"); 
      } 
     } 
     } 

     sb.Append("</ul>"); 
     return sb.ToString(); 
    } 
    } 
} 

: 이것은 내가있어 코드 (A HtmlHelper)입니다. 내가 MvcSiteMap이 더 이상 작동하지 않는 것처럼 보일 수 있도록 MVC Areas Lib을 사용하고 있습니다. {controller}/{action}은 (는) 이전에 있었던 것처럼 동작합니다.

http://localhost/mycontroller/myaction과 같은 페이지가 있는데 SiteMap에 존재한다고하면 메뉴가 제대로 생성됩니다. 그러나 내가 http://localhost/mycontroller/myaction/50을하고 매개 변수를 지정한다고 가정하면이 URL이 없기 때문에 SiteMap 생성기가 더 이상 작동하지 않습니다. tutorialMVC Areas Lib을 포함하지 않으므로이 문제에 대한 해결책은 작동하지 않습니다.

답변

0

봐, asp.net에서 사이트 맵은 크게 asp.net mvc :)에서 '비표준'구현과 달리 구현됩니다. 사이트 맵을 구성하는 방법을 내 앱에서도 선택해야합니다. 나는이 해결책이 이상적이고 우아한 것으로 생각한다. 그러나 그것은 나를 위해 매우 좋게 보인다. 뷰에 데이터를 표시하는 데 사용하는 Base 데이터 뷰 객체에는 유익한 코드를 사용하기 위해 유창하게이 모든 기능을 사용합니다. 그래서 거기에는 ' 링크''. 그러면 링크 란 무엇입니까?, 링크는 내 사이트의 모든 링크가 포함 된 정적 클래스를 나타냅니다. 그래서 예를 들어 당신 :

'링크' '수단'에서
http://localhost/myarea/contract/viewcontract/12 

:

BaseDV.SetPageMapBasedOnLink(Links.ContractView) 

및 SetPageMapBasedOnLink에 당신은에 따라 스위치가 : Links.ContractView 내 컨트롤러에서 나는 다음과 같이 떨어지게가 링크 값은 적절한 제목이나 원하는 것을 설정합니다. 아이디어를 얻었 으면 좋겠다.

+0

내 편집을 확인하면 링크 된 문서에서 권장하는대로 HtmlHelper를 기반으로 내 메뉴가 자동 생성됩니다. 나는 당신의 번역에 기초하여 이것이 어떻게 나를 위해 개인적으로 효과가 있을지 모르겠습니다. 그러나 나는 그것의 배후에있는 생각을 볼 수있다. – Kezzer

11

체크 아웃 MvcSitemap on Codeplex

+0

그래,하지만 lib를 사용하고있어, 어떻게 작동하는지 모르겠다. – Kezzer

+0

MvcSiteMap이 {controller}/{action}의 영역에서/{controller}/{action} 영역과 대조적으로 작동하기 때문에 오늘이 테스트를 거쳤습니다. – Kezzer

+0

Gah, 지역 지원이 있으므로 지금 사용 중입니다. 답변을 올바르게 표시 할 수 없습니다. ( – Kezzer

0

이 코드는 오프 트랙 나에게 조금 보인다. .NET MVC의 주된 아이디어는 관심사를 분리하는 것이므로 StringBuilder 객체를 채울 때 약간의 요점을 놓치고 있습니다. 내가 예상 할 수있는 모든 노드의 컬렉션을 반환하는 코드입니다 및 다음보기로 보내고 실제 HTML 레이아웃 않습니다.

.../myaction/{id}을 (를) 작동시키지 못하는 이유는 SiteMapNode가 데이터 구조를 인식하지 못했기 때문일 것입니다. 응용 프로그램의 경로 만 알면됩니다. 그들이 http://mvcsitemap.codeplex.com/에서 작동하게 만든다면 아마도 가치가 있지만 내 추측은 그렇지 않았을 것입니다. 매개 변수가있는 각 노드에 대해 노드가 어떤 노드인지 확인하고 데이터 저장소에서 가능한 모든 값을로드하는 등의 방법으로 해당 영역을 직접 채워야합니다. 다시 HTML이 아닌 도우미 클래스에서 객체를 다시 전달합니다.

+0

MvcSiteMap이 작동하지만, MvcSiteMap은 전혀 설계되지 않았고 다른 사람이 개발 한 타사 라이브러리이므로 전혀 몰랐으며 코드는 약간 벗어 났지만 실제로는 Microsoft의 MVC에서 가져 왔습니다. 예를 들어 사이트 맵을 생성하는 경우 – Kezzer

+0

MVC를 사용하여 작업을 올바르게 수행하는 방법에 대한 내용은 2 센트에 불과합니다. 개념에 익숙하지 않은 경우 ScottGu의 블로그 항목을 읽어보십시오. – synhershko

5

기뻐할 시간입니다. Change Set 24979은 지역 지원을 구현합니다.

"정의 사이트 맵 노드"

...

지역 | 옵션 | 지정된 컨트롤러 노드의 노드는

...로 연결되어야합니다.

+3

내가 요청한 사람이었습니다. – Kezzer

관련 문제