你好吗?
我在试图配置与MVCSITEMAP提供商的BreadCrumb配置SEO友好的URL路线时遇到了一些困难。看起来显然很简单,但是由于缺乏ASP.NET MVC的经验以及与SEO相关的内容以及与此组件有关。
为了学习目的,我创建了一个简单的MVC网站,在其中添加了MVC SiteMap提供商软件包。
这是我要实现的目标:
给定URL 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>
另外,控制器名称是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路线时,面包屑会成功地呈现。但是,到达此页面的链接是这样的URL:
http://localhost:50888/product/delect/lotes/1?title = product-name(不需要)
当我删除上述路线并运行应用程序时,面包屑根本不会呈现!
我这样实现了此页面的链接:
@Html.ActionLink(product.Title, "Details", new { title = product.UrlFriendlyTitle, id = product.Id },null)
我还试图创建动态杂志的实现,以及对MVC.SiteMap的调整,以遵循Maarten Balliauw的SiteMapprovider Github的说明正在震惊我的脑海。而且我不确定这是否是为此事创建此类功能的情况。
我希望你们能告诉我我应该走的方向,我真的很感谢您的帮助。
cristiano m dias
配置节点时,您必须考虑路由值。尽管您已经配置了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)
注意:要获取问题中的URL,您需要将路线更改为
product/{productTitle}/{id}
。