質問

MVCサイトマッププロバイダを使用して、私のウェブサイトのメニューを作成し、現在のメニュー項目を強調表示しています。

私のコントローラでは、インデックス、詳細、追加、編集、削除方法があります。メニュー項目として、インデックスと追加メソッドのみが利用可能です。

詳細アクションの場合、現在のメインメニュー項目(製品)をハイライトしたいと思います。どうやってそうするのですか?

私は試してみました:

<mvcSiteMapNode title="Details" action="Details" visibility="IfSelected,!*" />
.

しかし、それはメニューを強調表示し、それを望まないにもかかわらず詳細はメニューにあります。

それから私は

を試しました
<mvcSiteMapNode title="Details" action="Details" visibility="IfSelected,!*" preservedRouteParameters="id" />
.

詳細サブメニューをハイライト表示しますが、詳細サブメニューはメニューに隠されていて、メインメニュー項目( 'プロジェクト')が強調表示されています。

役に立ちましたか?

解決

あなたが明らかに達成しようとしている本当に2つの別々のものがありますが、あなたはそれらを単一の質問に結合しました。

まず、CRUD操作を行うには、記事 MvcSiteMapproverを作成する方法MVCSiteMapproverは、ユーザーの位置と付属のダウンロード可能なDemos 。具体的には、 mvcsitemaphider"> mvcsitemaphider"> mvcsitemaphider"> -forcing-a-match ノードのネスト方法を正確に示しているため、現在の要求、セットアップの可視性と一致させ、選択したレコードに従ってノード上のタイトルを動的に変更するように強制します。

あなたの質問の2番目の部分は、メニュー項目を強調表示するために出力HTMLを変更することです。これは、組み込み機能を使用して行うことができません。そのためには、/ views / shared/displaytemplates/sitemapnodemodel.cshtmlファイルを直接編集する必要があります。このファイルはNUGETパッケージによってMVCプロジェクトに追加され、アップグレード時に変更を上書きしないように注意してください。このファイルはメニュー、SiteMap、およびSiteMappath HTMLヘルパーによって共有されているので、メニューのコピーを作成するか、編集したい特定のHTMLヘルパーの分岐ロジックを常に使用して注意してください。

現在のページに最も近い照合ノードを決定するには、このビットのかみそりコードが必要です。

@{var isClosestVisibleMenuItem = false;}
@if ((Model.IsCurrentNode || (Model.IsInCurrentPath && !Model.IsRootNode && !Model.Descendants.Any())) 
    && Model.SourceMetadata["HtmlHelper"].ToString() == "MvcSiteMapProvider.Web.Html.MenuHelper")
{
    isClosestVisibleMenuItem = true;
}
.

SourceMetadataの値をチェックすると、メニューを参照していることを確認します - 他のすべてのHTMLヘルパーは常にISCLOSESTVisibleMenuitem変数をfalseに設定します。

それは変数を使ってテンプレートに出力するのかを知らせるだけです。これは、メニュー内の最も近い表示ノードの周囲に<b></b>を置くサンプルです。 Real-Worldの例では、それを強調表示するために特定のCSSクラスをアンカータグに追加することをお勧めします。

@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

@{var isClosestVisibleMenuItem = false;}
@if ((Model.IsCurrentNode || (Model.IsInCurrentPath && !Model.IsRootNode && !Model.Descendants.Any())) && Model.SourceMetadata["HtmlHelper"].ToString() == "MvcSiteMapProvider.Web.Html.MenuHelper")
{
    isClosestVisibleMenuItem = true;
}

@if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")  { 
    <text>@Model.Title</text>
} else if (Model.IsClickable) {

    if (isClosestVisibleMenuItem)
    {
        <b>
        @if (string.IsNullOrEmpty(Model.Description))
        {
            <a href="@Model.Url">@Model.Title</a>
        }
        else
        {
            <a href="@Model.Url" title="@Model.Description">@Model.Title</a>
        }
        </b>
    }
    else
    {
        if (string.IsNullOrEmpty(Model.Description))
        {
            <a href="@Model.Url">@Model.Title</a>
        }
        else
        {
            <a href="@Model.Url" title="@Model.Description">@Model.Title</a>
        }
    }
} else {
    if (isClosestVisibleMenuItem)
    {
        <b>@Model.Title</b>
    }
    else
    {
        <text>@Model.Title</text>   
    }
}
.

選択されたIFSelectedは、深い階層を持ち、現在のパスを表示したいと思う特定のユースケースのためのものです(どれほど深い)メニューをハイレベルで保持します。通常、これはメニューにのみ適用されます。他のHTMLヘルパーはどれもいません。しかし、あなたの質問については何も意味しないことはあなたが達成しようとしているものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top