WedX - журнал о программировании и компьютерных науках

Обновление до V4 привело к тому, что @Html.MvcSiteMap().SiteMapPath() ничего не возвращает

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

https://github.com/maartenba/MvcSiteMapProvider/wiki/Обновление-от-v3-до-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
            });
    }
23.09.2014

Ответы:


1

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

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

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

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

Чтобы это исправить, вы должны исправить конфигурацию маршрута, чтобы они вместо этого отображались в {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="https://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
        <!-- specifies the default culture sitemap En-uk -->
        <loc>https://www.example.com/sitemap.xml</loc>
    </sitemap>
    <sitemap>
        <loc>https://www.example.com/de/De/sitemap.xml</loc>
    </sitemap>
    <sitemap>
        <loc>https://www.example.com/mx/Es/sitemap.xml</loc>
    </sitemap>
</sitemapindex>

Вы также должны указать этот индекс карты сайта в файле robots.txt, чтобы боты второстепенных поисковых систем могли его автоматически подобрать. Например, если вы поместите приведенный выше XML-код в файл с именем sitemapindex.xml в корне вашего сайта (там, где он должен быть), вы можете добавить эту строку в свой файл robots.txt (в любом месте файла):

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

Ссылка: https://www.sitemaps.org/protocol.html#informing

Вы должны также выполнить переадресацию 301 для запросов /uk/En/SomeController/SomeAction и /uk/En/SomeController/SomeAction/SomeId на версии этих URL по умолчанию. Это можно сделать либо с помощью подкласса RouteBase для создания маршрута перенаправления, либо с помощью < href="https://stackoverflow.com/questions/4967542/asp-net-mvc-301-redirects#4995449">правило перезаписи 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"/>

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

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

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

Взгляните на Как заставить MvcSiteMapProvider запомнить позицию пользователя для подробного обсуждения этого поведения.

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

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

В веб.конфигурации:

<appSettings>
    <add key="MvcSiteMapProvider_AttributesToIgnore" value="myCustomValue"/>
</appSettings>
23.09.2014
  • sitemap.xml работает и показывает контент. Судя по карте сайта, данные загружаются правильно. Не уверен, почему он автоматически не ссылается на мой URL-адрес карты сайта, хотя для создания хлебной крошки. В шаблоне в общем каталоге указано, что у меня нет узлов. Насколько я понимаю, это кардинальное изменение между V3 и V4? 24.09.2014
  • Сопоставление узлов было улучшено, поэтому оно будет охватывать больше ситуаций, но это также означает, что оно является более строгим и, следовательно, не сопоставляет никакие узлы со значениями маршрута, отличными от действия, контроллера и области, без дополнительной настройки. Если вы опубликуете свой узел и конфигурацию маршрута, возможно, удастся обнаружить проблему. 24.09.2014
  • Добавил обновление к моему вопросу, мне нужен полностью статический XML-файл, но его можно сопоставить с заданным URL-адресом (в основном, как это было в V3), если это возможно 24.09.2014
  • Извините за поздний ответ. Действительно, проблема была устранена с помощью persistRouteParameters. Спасибо за это :) 28.09.2014
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]