mvc sitemapprovider 哈希片段

lyc*_*can 4 asp.net-mvc hash asp.net-mvc-4 mvcsitemapprovider

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

<mvcSiteMapNode title="Funds" controller="VcTransfer" action="Index/#"      preservedRouteParameters="">
 <mvcSiteMapNode title="Funds transfer" controller="VcTransfer" action="Index"  preservedRouteParameters="id" />
</mvcSiteMapNode>
Run Code Online (Sandbox Code Playgroud)

我想要与以下相同的结果路线:

Redirect(Url.Action("Index", "VcTransfer") + "#Network-tab");
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nig*_*888 5

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

这基本上意味着您的面包屑不会改变,并且在选择替代片段时所选菜单项不会改变。这不是错误,只是不可能做到。

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

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

<mvcSiteMapNode title="Funds" controller="VcTransfer" action="Index" fragment="Network-tab">
Run Code Online (Sandbox Code Playgroud)

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

内部 DI(根 web.config):

<appSettings>
    <add key="MvcSiteMapProvider_AttributesToIgnore" value="fragment"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)

外部DI:

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

然后修改你的/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>
}
Run Code Online (Sandbox Code Playgroud)