使MvcSiteMap Provider与自定义友好的SEO网址一起工作的困难

时间:2016-11-25 18:39:20

标签: c# asp.net asp.net-mvc-5 asp.net-mvc-routing mvcsitemapprovider

你好吗?

我在尝试使用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

1 个答案:

答案 0 :(得分:1)

配置节点时,必须考虑每个路由值。虽然您已配置id,但尚未为title配置任何内容。

尽管如此,titleMvcSiteMapProvider中的保留密钥名称。因此,您需要选择其他名称(例如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}