При обновлении до V4 @Html.MvcSiteMap().SiteMapPath() ничего не возвращал

Прежде чем я вернусь к более раннему пакету, кто-нибудь знает, почему это может быть? Я следовал этому руководству в значительной степени к письму.

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

Ура, J

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 ответ

Решение

Наиболее вероятной причиной является то, что вы не учли country или же lang Параметры маршрута в вашей конфигурации. А поскольку это окружающие значения, которые не имеют ничего общего с идентификацией страницы, вы можете использовать preservedRouteParamters, чтобы заставить их всегда совпадать.

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

В настоящее время нет способа указать preservedRouteParameters глобально, поэтому вам нужно будет предоставить этот атрибут на каждом узле.

Однако имейте в виду, что ваши локализованные страницы не будут отображаться в конечной точке XML-карты сайта по адресу /sitemap.xml при использовании preservedRouteParameters.

Чтобы это исправить, вы должны исправить конфигурацию маршрута, чтобы они вместо этого появлялись в {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
        });
}

Вам нужно будет создать индексный файл, чтобы поисковые системы знали о ваших локализованных URL-адресах, и отправляли индексный файл в поисковые системы, а не в /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

Вы также должны сделать 301 перенаправление для запросов /uk/En/SomeController/SomeAction а также /uk/En/SomeController/SomeAction/SomeId по умолчанию версии этих URL-адресов. Это может быть достигнуто либо путем создания подкласса RouteBase для создания маршрута перенаправления, либо с помощью правила перезаписи IIS в файле web.config.

Дополнительная информация, которая может быть полезной

Есть несколько вещей, которые могут привести к тому, что SiteMapPath не появится.

  1. Узлу, предназначенному для соответствия текущей странице, не хватает некоторых параметров маршрута или строки запроса.
  2. Обрезка безопасности включена, и у пользователя нет разрешения на просмотр текущего узла.
  3. Настройки видимости запрещают визуализацию узлов.
  4. Вспомогательные шаблоны HTML в папке /Views/Shared/DisplayTemplates/ запрещают их показ.
  5. Конфигурация не настроена на автоматический запуск.

Поскольку вы обновляетесь, наиболее вероятные причины - № 1 или № 5.

Вы можете исключить #5, перейдя к /sitemap.xml чтобы увидеть, если ваш XML-карта сайта отображается.

Может быть полезно временно добавить @Html.MvcSiteMap().SiteMap() на страницу макета, чтобы увидеть, если какие-либо узлы не преобразуются в правильный URL.

Если вы сделаете это, № 1 является наиболее вероятной причиной. Вы должны настроить каждое значение маршрута на определенное значение...

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

Это работает лучше всего в сочетании с провайдерами динамических узлов.

Или вы можете принудительно сопоставить любое значение, используя preservedRouteParameters.

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

Посмотрите, как заставить MvcSiteMapProvider запомнить позицию пользователя, чтобы подробно обсудить это поведение.

Кроме того, имейте в виду, что если вы используете пользовательские атрибуты, которые вы не собираетесь использовать с маршрутизацией, вам нужно добавить их в MvcSiteMapProvider_AttributesToIgnore настройка конфигурации.

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

В web.config:

<appSettings>
    <add key="MvcSiteMapProvider_AttributesToIgnore" value="myCustomValue"/>
</appSettings>
Другие вопросы по тегам