mvc sitemapprovider哈希片段

时间:2014-08-26 15:30:34

标签: 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"  preservedRouteParameters="id" />
</mvcSiteMapNode>

我想要相同的结果路线:

Redirect(Url.Action("Index", "VcTransfer") + "#Network-tab");

我希望我已经清楚了,先谢谢!!

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

(HTTP:)//本地主机:8080 / VcTransfer /索引#网络标签

2 个答案:

答案 0 :(得分:4)

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

这基本上意味着您的面包屑不会更改,并且选择备用片段时所选菜单项不会更改。这不是一个错误,这是不可能的。

但是,如果您需要添加片段而不是导航(例如javascript支持),则可以通过向节点添加自定义属性然后修改节点模板以在视图中输出片段来实现此目的

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

<mvcSiteMapNode title="Funds" controller="VcTransfer" action="Index" fragment="Network-tab">

然后确保将自定义属性的名称添加为要忽略的属性,或者它将作为查询字符串参数而不是片段显示在您的URL中。

内部DI(root web.config):

<appSettings>
    <add key="MvcSiteMapProvider_AttributesToIgnore" value="fragment"/>
</appSettings>

外部DI:

this.For<IReservedAttributeNameProvider>().Use<ReservedAttributeNameProvider>()
    .Ctor<IEnumerable<string>>("attributesToIgnore").Is(new string[] { "fragment" });

然后修改您的/Views/Shared/DisplayTemplates/SiteMapNodeModel.cshtml文件,如下所示,输出节点上存在的片段。

@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>
}

答案 1 :(得分:1)

谢谢! 与此同时,我找到了一种解决方法,但这是针对我的情况的:

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;

        }

我在交换机的默认情况下放置了与菜单链接对应的哈希值,因此在这种情况下,我不必在第一次加载视图时检查哈希...在其他情况下,我在回发期间设置了路由中的哈希值... 但再次感谢!当我无法做到这一点时,我会给你的答案添加书签:)