Asp.net mvc mvc sitemapprovider哈希片段

Asp.net mvc mvc sitemapprovider哈希片段,asp.net-mvc,asp.net-mvc-4,hash,mvcsitemapprovider,Asp.net Mvc,Asp.net Mvc 4,Hash,Mvcsitemapprovider,我正在使用sitemapprovider在MVC4应用程序中实现面包屑。 我需要添加一个哈希片段val <mvcSiteMapNode title="Funds" controller="VcTransfer" action="Index/#" preservedRouteParameters=""> <mvcSiteMapNode title="Funds transfer" controller="VcTransfer" action="Index" pres

我正在使用sitemapprovider在MVC4应用程序中实现面包屑。 我需要添加一个哈希片段val

<mvcSiteMapNode title="Funds" controller="VcTransfer" action="Index/#"      preservedRouteParameters="">
 <mvcSiteMapNode title="Funds transfer" controller="VcTransfer" action="Index"  preservedRouteParameters="id" />
</mvcSiteMapNode>
我希望我已经说清楚了,提前谢谢

编辑:最终结果应如下所示:


(http://localhost:8080/VcTransfer/Index#Network tab

浏览器会处理一个片段,但不会回发到服务器,因此在使URL唯一时,它实际上并不“算数”。因此,如果您有多个只因片段不同的节点,MvcSiteMapProvider将无法区分它们,并且无论您选择哪个节点,它都将始终匹配注册的第一个节点

这基本上意味着您的面包屑不会改变,并且当选择一个备用片段时,所选菜单项也不会改变。这不是一个bug,只是不可能做到

但是,如果出于导航以外的其他原因(例如javascript支持)需要添加片段,可以通过向节点添加自定义属性,然后修改节点模板以在视图中输出片段来完成

首先,向节点添加自定义属性

<mvcSiteMapNode title="Funds" controller="VcTransfer" action="Index" fragment="Network-tab">
@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

@{
    var fragment = (Model.Attributes["fragment"] != null) ? "#" + Model.Attributes["fragment"] : "";
    var url = Model.Url + fragment;
}

@if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")  { 
    <text>@Model.Title</text>
} else if (Model.IsClickable) { 
    if (string.IsNullOrEmpty(Model.Description))
    {
        <a href="@url">@Model.Title</a>
    }
    else
    {
        <a href="@url" title="@Model.Description">@Model.Title</a>
    }
} else { 
    <text>@Model.Title</text>
}
谢谢! 与此同时,我找到了一个解决办法,但这是针对我的具体情况:

switch (window.location.hash.toString()) {
            case '#Network-tab':
                //alert('Network-navTab');
                $("#Network-navTab").addClass("active");
                $("#Network-tab").addClass("active in");
                break;
            case '#Network_Company-tab':
                //alert('Network_Company-navTab');
                $("#Network_Company-navTab").addClass("active");
                $("#Network_Company-tab").addClass("active in");
                break;
            case '#Company_Skin-tab':
                //alert('Company_Skin-navTab');
                $("#Company_Skin-navTab").addClass("active");
                $("#Company_Skin-tab").addClass("active in");
                break;
            case '#Skin_Player-tab':
                //alert('Skin_Player-navTab');
                $("#Skin_Player-navTab").addClass("active");
                $("#Skin_Player-tab").addClass("active in");
                    break;
            default:
                $("#Network-navTab").addClass("active");
                $("#Network-tab").addClass("active in");
                break;

        }
我已经将对应于菜单链接的散列放在开关的默认情况下,因此在这种情况下,我不必在第一次加载视图时检查散列…在其他情况下,我在回发期间在路由中设置散列。。。
但再次感谢!当我无法这样做时,我会将您的答案添加到书签中:)

在使用AttributesToIgnore键时,您可以添加多个值。用逗号隔开就行了。
this.For<IReservedAttributeNameProvider>().Use<ReservedAttributeNameProvider>()
    .Ctor<IEnumerable<string>>("attributesToIgnore").Is(new string[] { "fragment" });
@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

@{
    var fragment = (Model.Attributes["fragment"] != null) ? "#" + Model.Attributes["fragment"] : "";
    var url = Model.Url + fragment;
}

@if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")  { 
    <text>@Model.Title</text>
} else if (Model.IsClickable) { 
    if (string.IsNullOrEmpty(Model.Description))
    {
        <a href="@url">@Model.Title</a>
    }
    else
    {
        <a href="@url" title="@Model.Description">@Model.Title</a>
    }
} else { 
    <text>@Model.Title</text>
}
switch (window.location.hash.toString()) {
            case '#Network-tab':
                //alert('Network-navTab');
                $("#Network-navTab").addClass("active");
                $("#Network-tab").addClass("active in");
                break;
            case '#Network_Company-tab':
                //alert('Network_Company-navTab');
                $("#Network_Company-navTab").addClass("active");
                $("#Network_Company-tab").addClass("active in");
                break;
            case '#Company_Skin-tab':
                //alert('Company_Skin-navTab');
                $("#Company_Skin-navTab").addClass("active");
                $("#Company_Skin-tab").addClass("active in");
                break;
            case '#Skin_Player-tab':
                //alert('Skin_Player-navTab');
                $("#Skin_Player-navTab").addClass("active");
                $("#Skin_Player-tab").addClass("active in");
                    break;
            default:
                $("#Network-navTab").addClass("active");
                $("#Network-tab").addClass("active in");
                break;

        }