你好吗?
我在尝试使用MvcSiteMap提供程序的Breadcrumb正确配置一个SEO友好的URL路由时遇到了一些困难。 看起来很简单,但由于我缺乏ASP.NET MVC以及与SEO相关的东西和这个组件的经验,我迷路了。
出于学习目的,我创建了一个简单的MVC WebSite,其中我添加了MVC SiteMap Provider包。
这是我想要实现的目标:
鉴于网址http://localhost:1234/product/the-product-name/1234,我想显示一个如下所示的面包屑:
主页>>产品>>产品名称
为了以这种方式生成URL,我创建了以下路由:
routes.MapRoute(
name: "SEO_Product",
url: "product/{id}/{title}",
defaults: new { controller = "Product", action = "Details" }
);
在Mvc.sitemap文件中,我创建了以下节点结构:
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Products" controller="Product" action="Index">
<mvcSiteMapNode title="Details" controller="Product" action="Details" preservedRouteParameters="id" />
</mvcSiteMapNode>
</mvcSiteMapNode>
此外,Controller名称是ProductController,接收请求的操作方法如下:
[SiteMapTitle("Title")]
public ActionResult Details(int id)
{
var productSearchResult = productRepository.List(pr => pr.Id == id);
var product = default(Product);
if (productSearchResult.Item != null)
product = productSearchResult.Item.FirstOrDefault();
else
RedirectToAction("Index");
return View(product);
}
当我注释掉上面的SEO_Product路线时,面包屑会成功呈现。但是,为了到达此页面而生成的链接是这样的网址:
http://localhost:50888/Product/Details/1?title=the-product-name(不希望)
当我取消注释上述路线并运行应用程序时,面包屑根本无法渲染!
我实现了这个页面的链接:
@Html.ActionLink(product.Title, "Details", new { title = product.UrlFriendlyTitle, id = product.Id },null)
我还尝试创建DynamicNodeProvider的实现以及对Mvc.sitemap的调整,试图按照位于Maarten Balliauw的SiteMapProvider GitHub上的说明进行操作,但是我失去了更多,并且收到了大量的黄色死亡屏幕我在想。而且我不确定这是否就此问题创建了这样的功能。
我希望你们能告诉我应该去哪个方向,我非常感谢你的帮助。
Cristiano M Dias
答案 0 :(得分:1)
配置节点时,必须考虑每个路由值。虽然您已配置id
,但尚未为title
配置任何内容。
尽管如此,title
是MvcSiteMapProvider
中的保留密钥名称。因此,您需要选择其他名称(例如productTitle
)作为路由密钥。
routes.MapRoute(
name: "SEO_Product",
url: "product/{id}/{productTitle}",
defaults: new { controller = "Product", action = "Details" }
);
然后考虑节点配置中的productTitle
参数。这可确保在传递productTitle
路由值时匹配。
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Products" controller="Product" action="Index">
<mvcSiteMapNode title="Details" controller="Product" action="Details" preservedRouteParameters="id,productTitle" />
</mvcSiteMapNode>
</mvcSiteMapNode>
您的链接也应使用productTitle
。
@Html.ActionLink(product.Title, "Details", new { productTitle = product.UrlFriendlyTitle, id = product.Id },null)
注意:要获取问题中的网址,您需要将路线更改为
product/{productTitle}/{id}
。