【问题标题】:mvc sitemapprovider hash fragmentmvc sitemapprovider 哈希片段
【发布时间】:2014-08-26 15:30:33
【问题描述】:

我正在使用 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:)//localhost:8080/VcTransfer/Index#Network-tab

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 hash mvcsitemapprovider


    【解决方案1】:

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

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

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

    首先,给节点添加一个自定义属性。

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

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

    内部 DI(根 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>
    }
    

    【讨论】:

    • 顺便说一句,使用 AttributesToIgnore 键时,您可以添加多个值。只需用逗号分隔它们。
    【解决方案2】:

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

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

    我已经将与菜单链接对应的哈希放在了开关的默认情况下,所以在这种情况下,我不必在第一次加载视图时检查哈希......在其他情况下,我在回发期间在路由中设置了哈希... 但再次感谢!当我无法执行此操作时,我会将您的答案添加为书签:)

    【讨论】:

      猜你喜欢
      • 2013-08-10
      • 2010-12-19
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多