Сложности в том, чтобы заставить провайдера 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}
,