1


1

ホームページでSiteMapPathルートノードを非表示にする方法

ユーザーがルートノードページにいるときにSiteMapPathコントロールでルートノードを非表示にする方法はありますか。 たとえば、子ページに関する私のブレッドクラム・トレイルは次のとおりです。

_ ホーム>製品>ハンマー>ボールピーン _

それは結構です。 ただし、ユーザーがホームページにいると、SiteMapPathコントロールが表示されます。

_ Home _

これは無駄な混乱です。 ユーザーがホームページにいるときにHome(ルートノード)を表示しないようにしたい。 SiteMapPathコントロールはマスターページにあります。 また、私はSiteMapResolveを処理してノード内のクエリ文字列を設定します。

10 Answer


13


考えられる解決策の1つは、ホームページの `+ SiteMapPath +`コントロールを単純に非表示にすることです。

mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);


3


私はいくつかのコードベースの例を見ましたが、これはルートノードと次のパスセパレータを隠すチープなCSSソリューションです(あなたのターゲットブラウザはCSS 2.1をサポートしなければなりません)。

RootNodeTemplateを次のように空に設定してRootノードを強制終了します。


これでRootノードに何もレンダリングされませんが、Rootのパス区切り文字は表示されたままなので、これらのCSSセレクタをスタイルシートに追加します(重要:SiteMapPath1要素に 'breadCrumbTrail’という名前のCssClassを付けました)。

.breadCrumbTrail
{フォントサイズ:小。 }

/ * SiteMapPathによってレンダリングされた最初の子要素は、自分が制御できないタグです。その隣にはルートノードのspanタグがあり、その隣にはルートノードのpath-separatorスパンがあります。 * /
.breadCrumbTrail > a:first-child + span + span
{表示:なし; }


2


私はこれを理解することができたが、私が抱えていた問題がやや微妙だったのでそれは時間がかかりました。 schou-rodeには正しい考えがあり、それが成功せずに「+ Page_Load 」でやっていました。 動作しなかった理由は、 ` SiteMapResolve `でノードのクローンを作成し、クローンを返していたためです。 これは ` Page_Load `の前に発生したため、 ` SiteMap.CurrentNode `はクローンを参照し、 ` SiteMap.RootNode +`との比較は失敗しました。

これが完全な解決策です。

protected void Page_Load(object sender, EventArgs e)
{
    SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}

private SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
    if (SiteMap.CurrentNode == null || SiteMap.CurrentNode == SiteMap.RootNode)
    {
        return SiteMap.CurrentNode;
    }
    // clone and set querystring in other nodes...
}


1


簡単な3ステップでSiteMapPathルートノートを隠すための正しい方法の一つ:

  • ContentPageからの参照MasterPage 例:

<%@ MasterType VirtualPath = "〜/ Master.master"%>
  • デザイナクラスでSiteMapPathをProtected Internalにする例:*

保護された内部グローバル:: System.Web.UI.WebControls.SiteMapPath SiteMapPath1。
  • ContentPageから隠す*例:*

Master.SiteMapPath1.Visible =(SiteMap.CurrentNode!= SiteMap.RootNode);


1


ホームページで、以下のスクリプトを "head"部分に追加します。

protected void Page_Load(object sender, EventArgs e)
{
    SiteMapPath sp = (SiteMapPath)Master.FindControl("SiteMapPath1");
    sp.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}

上記のメソッドを適用するには、マスターページに「+ SiteMapPath 1」を配置する必要があります。


1


SiteMapDataSourceにはShowStartingNodeプロパティもあります。 ルートノードを非表示にするには、これをfalseに設定します。


1


私は自分の_Layout.cshtmlにプラグインしましたが、最も簡単な解決策はIfを(以前に提案したロジックで)ラップして1日に呼び出すことです:

@if(SiteMap.CurrentNode!= SiteMap.RootNode){@ Html.MvcSiteMap()。SiteMapPath()}


0



そしてCSSコード:

#ctl00_contentNavigation span:nth-​​child(2)、span:nth-​​child(3){display:none; }


0


最近私は同様の問題を抱えていましたが、私は私のソリューションのメニューにXmlDataSourceを使用しています。

ソースXMLのサンプル構造


'root’メニュー項目を表示したくない場合は、XmlDataSourceのXPathプロパティを '/ root / *'に設定するだけです。


0


  • ParentLevelsDisplayed = 0 *が役立ちます