2014-02-04 2 views
2

У меня есть ссылка в моем URL-список, который включает в себя динамические идентификаторы, т.е.MvcSitemapProvider - Добавить значение игнорировать в URL-адрес распознавателя

/контроллер/действие/ID

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

Есть ли простое решение или какие-либо советы по решению этой проблемы?

Спасибо заранее

ответ

2

Есть 2 способа использовать «идентификатор» или любое другое значение маршрута с MvcSiteMapProvider.

1. Создайте узел для каждого «id» (обычно это выполняется с помощью реализации DynamicNodeProviderBase). Это дает вам соотношение 1 к 1 между значением «id» и узлом. Используйте этот метод, если у вас есть < 10 000 узлов, и вы хотите, чтобы все они были проиндексированы поисковыми системами.

<mvcSiteMapNode title="Product 1" controller="Product" action="Details" id="1"/> 
<mvcSiteMapNode title="Product 2" controller="Product" action="Details" id="2"/> 
<mvcSiteMapNode title="Product 3" controller="Product" action="Details" id="3"/> 

2. Создание единого узла, чтобы соответствовать все значения "ID", установив preservedRouteParameters = "идентификатор" на узле. Это даст вам 1-к-1 реланионацию между именем параметра маршрута «id» (значение не имеет значения) и узлом. Это работает только для тропы; для конечных точек Menu, SiteMap и /sitemap.xml вам нужно будет использовать visibility provider, а также атрибут SiteMapTitle, чтобы исправить отображение пользовательского интерфейса. Используйте этот метод для страниц администрирования, которые редактируют данные и никогда не будут замечены поисковыми системами.

<mvcSiteMapNode title="Product 1" controller="Product" action="Details" preservedRouteParameters="id"/> 

Обратите внимание, что вы также можете комбинировать обе технологии на одном и том же узле, если у вас есть несколько параметров. Если, например, у вас есть пользовательский параметр «userId», о котором поисковые системы никогда не будут знать, вы можете уменьшить количество узлов (обычно вам нужно будет предоставить узел для [всех значений «id»] X [все «userId»), то есть общее количество узлов будет равно произведению всех комбинаций потенциальных значений) в SiteMap, всегда сопоставляя «userId», но все же индексируя все продукты.

<mvcSiteMapNode title="Product 1" controller="Product" action="Details" id="1" preservedRouteParameters="userId"/> 
<mvcSiteMapNode title="Product 2" controller="Product" action="Details" id="2" preservedRouteParameters="userId"/> 
<mvcSiteMapNode title="Product 3" controller="Product" action="Details" id="3" preservedRouteParameters="userId"/> 

Заметим также, что вы не должны использовать XML, чтобы использовать эти методы - они работают при объявлении узлы другими способами.

В моем блоге описывается каждый из этих методов с загружаемыми рабочими образцами: How to Make MvcSiteMapProvider Remember a User's Position.

+0

Благодарим вас за быстрый ответ NightOwl888. Я хочу использовать второй способ, потому что для первого способа, который у меня есть для многих узлов и для их хранения все время, требуется огромный объем памяти. В настоящее время я использую внешний контейнер DI с Unity. Когда я устанавливаю сохраненныеRouteParameters на «id», тогда первая страница «Подробности» работает с панировочными сухарями, то есть/details/452. Когда я перехожу на другую страницу i.e./ details/453, у меня больше нет панировочных сухарей. Я думаю, что это проблема кэширования. Насколько я читал на вашей странице, «Как сделать ...» должен быть автоматически отключен кеш. – Andy

+0

Если вы используете savedRouteParameters = "parameterName", вам не нужно связываться с кешированием, потому что в этом случае он будет автоматически отключен. Вам нужно только отключить разрешенное кэширование URL-адресов, если вы хотите вручную имитировать то, что сохранилиRouteParameters, используя статический объект SiteMaps в методе действий для установки RouteValues. – NightOwl888

+0

Я попробовал это с вашим примером, там хорошо работает. Но в моем проекте он не работает. Также, когда я отключу кеширование с cacheResolvedUrl = "0", это не сработает. Только когда я освобожу весь кеш, он загружает мои данные. Я пробовал также с внутренним DI, но это та же проблема. У вас есть еще идея, что я могу попробовать? – Andy

Смежные вопросы