При обновлении до 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 не появится.
- Узлу, предназначенному для соответствия текущей странице, не хватает некоторых параметров маршрута или строки запроса.
- Обрезка безопасности включена, и у пользователя нет разрешения на просмотр текущего узла.
- Настройки видимости запрещают визуализацию узлов.
- Вспомогательные шаблоны HTML в папке /Views/Shared/DisplayTemplates/ запрещают их показ.
- Конфигурация не настроена на автоматический запуск.
Поскольку вы обновляетесь, наиболее вероятные причины - № 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>