在我回到之前的软件包之前,有人知道为什么会这样吗?我几乎遵循了这本指南。
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
});
}
答案 0 :(得分:1)
最可能的原因是您未在配置中考虑country
或lang
路由参数。由于这些是与页面识别无关的环境值,因此您可以使用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或#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>