Сложности в том, чтобы заставить провайдера MvcSiteMap работать с настраиваемым дружественным URL-адресом SEO

Как дела?

У меня возникли трудности с настройкой оптимизированного для SEO маршрута URL, который корректно работает с Breadcrumb провайдера MvcSiteMap. Выглядит просто, но я заблудился из-за отсутствия опыта работы с ASP.NET MVC, а также с материалами, связанными с SEO, и с этим компонентом.

Для изучения я создал простой веб-сайт MVC, в который я добавил пакет MVC SiteMap Provider.

Вот что я пытаюсь достичь:

Учитывая 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 выше. Тем не менее, ссылка, созданная для перехода на эту страницу, имеет следующий вид:

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.site, пытаясь следовать инструкциям, размещенным на сайте GarHub Маартена Баллиау, но я потерял еще больше и получил множество желтых экранов смерти, которые уносят мою разум. И я не совсем уверен, если это случай создания такой функции по этому вопросу.

Я надеюсь, что вы, ребята, сможете показать мне, в каком направлении мне идти, и я очень ценю вашу помощь.

Криштиану М Диас

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)

ПРИМЕЧАНИЕ. Чтобы получить URL, который у вас есть в вашем вопросе, вам нужно изменить маршрут на product/{productTitle}/{id},

Другие вопросы по тегам