升级到V4导致@ Html.MvcSiteMap()。SiteMapPath()不返回任何内容

时间:2014-09-23 09:51:25

标签: mvcsitemapprovider

在我回到之前的软件包之前,有人知道为什么会这样吗?我几乎遵循了这本指南。

https://github.com/maartenba/MvcSiteMapProvider/wiki/Upgrading-from-v3-to-v4

干杯, Ĵ

mvc.sitemap

<?xml version="1.0" encoding="utf-8" ?>

<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Opportunity Stream" controller="TaskStream" action="Index"/>
    <mvcSiteMapNode title="Opportunity Stream" controller="TaskStream" action="IndexNew"/>
    <mvcSiteMapNode title="Appointment" controller="Appointment" action="Index"/>
    <mvcSiteMapNode title="Vehicle Search" controller="VehicleSearch" action="Index"/>
    <mvcSiteMapNode title="Stock" controller="Stock" action="Index"/>
    <mvcSiteMapNode title="Admin" controller="Admin" action="Index">
        <mvcSiteMapNode title="Team Management" controller="Admin" action="TeamManagement">
            <mvcSiteMapNode title="Manage Team Member" controller="Admin" action="TeamManagementDetails"/>
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Site Management" controller="Site" action="Index">
            <mvcSiteMapNode title="Site" controller="Site" action="SiteOptions" preservedRouteParameters="id">
                <mvcSiteMapNode title="Default Calendar" controller="Site" action="DefaultCalendar"/>
                <mvcSiteMapNode title="Exception Calendar" controller="Site" action="ExceptionCalendar"/>
                <mvcSiteMapNode title="Manage Site" controller="Site" action="Details"/>
                <mvcSiteMapNode title="Manage Site" controller="Site" action="Edit"/>
            </mvcSiteMapNode>
            <mvcSiteMapNode title="Create Site" controller="Site" action="Create"/>
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Approve Leave Requests" controller="LeaveRequest" action="Index"/>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="Auction" controller="Auction" action="Index"/>
    <mvcSiteMapNode title="Employee" controller="Employee" action="Index">
        <mvcSiteMapNode title="Calendar Exceptions" controller="Site" action="TeamExceptions"/>
        <mvcSiteMapNode title="Employee Detail" controller="Employee" action="Detail" clickable="false"/>
        <mvcSiteMapNode title="Employee Detail" controller="Employee" action="Edit" clickable="false"/>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="User Profile" controller="UserProfile" action="Index">
        <mvcSiteMapNode title="My Holidays" controller="UserProfile" action="MyHolidays"/>
        <mvcSiteMapNode title="Create Leave Request" controller="LeaveRequest" action="Create"/>
    </mvcSiteMapNode>

</mvcSiteMapNode>

RouteConfig

public static void RegisterRoutes(RouteCollection routes)
    {
        XmlSiteMapController.RegisterRoutes(RouteTable.Routes);

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*alljs}", new
        {
            alljs = @".*\.js(/.*)?"
        });
        routes.IgnoreRoute("{*allpng}", new
        {
            allpng = @".*\.png(/.*)?"
        });
        routes.IgnoreRoute("{*allcss}", new
        {
            allcss = @".*\.css(/.*)?"
        });
        routes.IgnoreRoute("{*allgif}", new
        {
            allgif = @".*\.gif(/.*)?"
        });
        routes.IgnoreRoute("{*alljpg}", new
        {
            alljpg = @".*\.jpg(/.*)?"
        });

        routes.MapRoute("Default", "{controller}/{action}/{id}",
            new
            {
                country = "uk",
                lang = "En",
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional
            });
        routes.MapRoute("localizedDefault", "{country}/{lang}/{controller}/{action}/{id}",
            new
            {
                country = "uk",
                lang = "En",
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional
            });
    }

1 个答案:

答案 0 :(得分:1)

最可能的原因是您未在配置中考虑countrylang路由参数。由于这些是与页面识别无关的环境值,因此您可以使用savedRouteParamters强制它们始终匹配。

<mvcSiteMapNode title="Home" controller="Home" action="Index" preservedRouteParameters="country,lang">

目前无法全局指定savedRouteParameters,因此您需要在每个节点上提供此属性。

但是,请注意,使用savedRouteParameters时,您的本地化页面不会出现在/sitemap.xml的XML站点地图端点中。

要解决此问题,您应该修改路线配置,以便它们显示在{country}/{lang}/sitemap.xml。将2条路由添加到您的配置中以创建本地化的sitemap.xml端点,如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
    XmlSiteMapController.RegisterRoutes(RouteTable.Routes);

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{*alljs}", new
    {
        alljs = @".*\.js(/.*)?"
    });
    routes.IgnoreRoute("{*allpng}", new
    {
        allpng = @".*\.png(/.*)?"
    });
        routes.IgnoreRoute("{*allcss}", new
    {
        allcss = @".*\.css(/.*)?"
    });
        routes.IgnoreRoute("{*allgif}", new
    {
    allgif = @".*\.gif(/.*)?"
    });
        routes.IgnoreRoute("{*alljpg}", new
    {
        alljpg = @".*\.jpg(/.*)?"
    });

    // Localized XML Sitemap routes for MvcSiteMapProvider
    routes.MapRoute("localizedSitemap", "{country}/{lang}/sitemap.xml",
        new
        {
            country = "uk",
            lang = "En",
            controller = "XmlSiteMap",
            action = "Index",
            page = 0
        });
    routes.MapRoute("localizedSitemapPage", "{country}/{lang}/sitemap-{page}.xml",
        new
        {
            country = "uk",
            lang = "En",
            controller = "XmlSiteMap",
            action = "Index",
            page = 0
        });

    routes.MapRoute("Default", "{controller}/{action}/{id}",
        new
        {
            country = "uk",
            lang = "En",
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional
        });
    routes.MapRoute("localizedDefault", "{country}/{lang}/{controller}/{action}/{id}",
        new
        {
            country = "uk",
            lang = "En",
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional
        });
}

您需要创建索引文件,以便搜索引擎了解您的本地化网址,并将索引文件提交给搜索引擎而不是/sitemap.xml的搜索引擎。

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
        <!-- specifies the default culture sitemap En-uk -->
        <loc>http://www.example.com/sitemap.xml</loc>
    </sitemap>
    <sitemap>
        <loc>http://www.example.com/de/De/sitemap.xml</loc>
    </sitemap>
    <sitemap>
        <loc>http://www.example.com/mx/Es/sitemap.xml</loc>
    </sitemap>
</sitemapindex>

您还应该在robots.txt文件中指定此站点地图索引,以便大量次要搜索引擎可以自动提取。例如,如果您将上述XML放入站点根目录中的sitemapindex.xml文件中(它应该在哪里),则可以将此行添加到robots.txt文件中(文件中的任何位置) :

Sitemap: http://www.example.com/sitemapindex.xml

参考:http://www.sitemaps.org/protocol.html#informing

也应对/uk/En/SomeController/SomeAction/uk/En/SomeController/SomeAction/SomeId的请求执行301重定向到这些网址的默认版本。这可以通过subclassing RouteBase来实现重定向路由,也可以使用web.config文件中的IIS rewrite rule来完成。

可能有帮助的其他信息

有几件事可能导致SiteMapPath无法显示。

  1. 用于匹配当前页面的节点缺少某些路由或查询字符串参数。
  2. 启用安全修整,用户无权查看当前节点。
  3. 可见性设置禁止呈现节点。
  4. / Views / Shared / DisplayTemplates /文件夹中的HTML帮助器模板禁止显示它们。
  5. 配置未设置为自动启动。
  6. 由于您正在升级,最可能的原因是#1或#5。

    您可以通过导航到/sitemap.xml来排除#5以查看您的XML站点地图是否正在呈现。

    @Html.MvcSiteMap().SiteMap()临时添加到布局页面以查看是否有任何节点未解析为正确的网址可能会有所帮助。

    如果你这样做,#1是最可能的原因。您必须将每个路由值配置为特定值...

    <mvcSiteMapNode title="Foo" action="Index" controller="Customer" id="3"/>
    

    这最适合与dynamic node providers一起使用。

    或者您可以使用savedRouteParameters强制匹配任何值。

    <mvcSiteMapNode title="Foo" action="Index" controller="Customer" preservedRouteParameters="id" />
    

    请查看How to Make MvcSiteMapProvider Remember a User's Position深入讨论此行为。

    另外,请记住,如果您使用的是不打算与路由一起使用的自定义属性,则需要将它们添加到MvcSiteMapProvider_AttributesToIgnore配置设置中。

    <mvcSiteMapNode title="Foo" action="Index" controller="Customer" myCustomValue="Something" />
    

    在web.config中:

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