2009-07-02 11 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(); 
    } 
    } 
} 

:これは私が持っているコード(HtmlHelper)です。私はMVC Areas Libを使用していますので、MvcSiteMapはこれまでと同じように動作します。{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 

「は、」リンク「」を意味しますLinks.ContractViewと私のコントローラでは私はこのようななめらかあります

BaseDV.SetPageMapBasedOnLink(Links.ContractView) 

をしてSetPageMapBasedOnLinkに、あなたはに基づいてスイッチを持っていますリンクの値は、適切なタイトルや必要なものを設定します。 アイデアがあることを願って、これが決定するのに役立ちます!

+0

私の編集をチェックすると、リンク先の記事で推奨されているようにHtmlHelperに基づいてメニューが自動的に生成されます。私はあなたの翻訳に基づいて、これが私にとって個人的にどのように機能するかはわかりません。しかし、私はそれの背後にあるアイデアを見ることができます。 – Kezzer

11
+0

ええ、私は領域libを使用しているので、どのように動作するのかわかりません。 – Kezzer

+0

MvcSiteMapはarea/{controller}/{action}とは対照的に{controller}/{action}に基づいて動作するので、これは現在テストされています。 – Kezzer

+0

ガー、エリアサポートがあるのでこれを使用していますが、私はあなたの答えを正しいものとしてマークすることはできません:( – 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

関連する問題