1

Как вы поживаете?Сложности при создании MvcSiteMap Provider работают с настраиваемым дружественным поисковым URL-адресом

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

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

Here's, что я пытаюсь достичь:

Учитывая 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 файле, я создал следующий узел STRU cture:

<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/Details/1?title=the-product-name (НЕ ХОЧЕТ)

и когда я раскомментировать маршрут выше и запустить приложение, то крошка просто не делает!

Я реализовал ссылку на эту страницу так:

@Html.ActionLink(product.Title, "Details", new { title = product.UrlFriendlyTitle, id = product.Id },null) 

Я также пытался создать реализацию DynamicNodeProvider вместе с корректировками в Mvc.sitemap в попытке следовать инструкциям, расположенные на Маартен Balliauw-х SiteMapProvider GitHub, но я потерял еще больше и получил много желтых экранов смерти, которые дуют мне в голову. И я не уверен, что это случай создания такой функции для этого.

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

Cristiano M Dias

ответ

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}.