0

Я использую MvcSitemapProvider в своем приложении MVC4. Моим контроллерам нужны параметры для разрешения отношений 1: n в базе данных. Например: Магазин> Пункт> ItemDetails. Допустим, пользователь просматривает детали ItemXYZ и нажимает на Shop>. Item> ItemDetails Я хочу, чтобы приложение снова отображало ItemXYZ. Таким образом, MvcSitemapProvider должен будет хранить ItemID. Странное поведение заключается в том, что когда я меняю любой код, запустите его -> он работает. Если я остановлю его, перезапустите его (точно таким же кодом), это не сработает. Если я снова сменил код -> он снова работает. Так как это возможно. Это моя карта сайта-конфигурации:MvcSitemapProvider параметры иногда иногда работают

<?xml version="1.0" encoding="utf-8" ?> 
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0" 
      xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd"> 

    <mvcSiteMapNode title="Werk" controller="Settlement" action="Index"> 
    <mvcSiteMapNode title="Abteilung" controller="Section" action="Index" preservedRouteParameters="settlementID" inheritedRouteParameters="settlementID"> 
     <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="sectionID" inheritedRouteParameters="sectionID"/> 
    </mvcSiteMapNode> 
    </mvcSiteMapNode> 

</mvcSiteMap> 

И это контроллер (все выглядят совсем то же самое):

public class SectionController : ControllerBase 
{ 
    // 
    // GET: /Section/ 

    [SiteMapPreserveRouteData] 
    public ActionResult Index(int settlementID) 
    { 
     using (var e = new ClapEntities()) 
     { 
      return View(e.Sections.Where(x => x.SettlementID == settlementID).ToList()); 
     } 
    } 
} 

Это рабочий код, если я не перезапустить приложение. Если я перезапущу приложение, это не сработает. Но если я прокомментирую, например. [SiteMapPreserveRouteData] -Атрибут, он будет работать еще раз. Поэтому я перезапускаю приложение, и я больше не работаю -> раскомментируйте атрибут, и он снова работает, пока я его не перезапущу.

Так как это возможно?

EDIT: Это не имеет никакого отношения к изменению кода. Он работает, когда я выбираю rebuild в меню визуальной студии. Если нет, это не будет работать дважды.

+0

FYI - Я сделал свое дело (во второй раз) с Маартеном об удалении SiteMapPreserveRouteDataAttribute из проекта. Проанализировав его внимательно, я не понимаю, как это может сделать что-нибудь полезное. Я рекомендую его использовать. – NightOwl888

ответ

1

Я не уверен, что пример вы следуете, но эта конфигурация имеет некоторые проблемы:

  1. inheritedRouteParameters для наследования параметров от родительского узла (mvcSiteMapNode). В вашем примере показано, что идентификатор поселения является частью SectionController, а не SettlementController, поэтому нет необходимости наследовать его.
  2. Вы используете как сохраненныеRouteParameters, так и SiteMapPreserveRouteDataAttribute. Они не предназначены для одновременного использования.

Кроме того, убедитесь, что у вас установлена ​​последняя версия (в настоящее время 4.0.6), поскольку с момента официального выпуска были исправлены некоторые ошибки, связанные с узлами.

Если вы исправите эти проблемы и у вас все еще есть проблемы, создайте небольшой демонстрационный проект, который воспроизводит поведение, и либо разместите его на GitHub, либо запишите его и сделайте его доступным для загрузки, затем open a new issue и разместите местоположение своей демонстрации так, чтобы мы можем взглянуть.

UPDATE

перечитываю свой вопрос и заметил, что вы пытаетесь отобразить продукты из базы данных. Использование preserveRouteParameters полезно только для помощника HTML SiteMapPath (breadcrumb), когда вы используете навигацию на основе списка или таблицы данных базы данных. Он используется, чтобы заставить каждый идентификатор соответствовать одному узлу, скопировав значение параметра из текущего HTTP-запроса.

Однако, если в файл Sitemap не добавлены фактические узлы для каждого продукта, вы не сможете просмотреть их в других помощниках HTML, таких как Menu или SiteMap, и, что более важно, они не будут отображаться в конечной точке /sitemaps.xml для поисковых систем.

Я предполагаю, что вы хотите, чтобы ваши продукты индексировались в поисковых системах, поэтому я рекомендую вам вместо этого использовать dynamic node providers для загрузки ваших узлов из вашей базы данных в карту сайта.Это сохранит их все в общем кеше, поэтому он очень эффективен, и они не будут «забыты» между запросами. Просто не забудьте установить идентификатор каждого продукта, используя node.RouteValues.Add("id", product.id), поэтому есть уникальный идентификатор, чтобы сделать совпадение.

+0

Ну, я исправил это, но все равно существует такое же поведение. Если я выберу rebuild, он будет работать один раз. @ NightOwl888 –

+0

ой, и я использую nuget ... должна быть последняя версия –

+0

К сожалению, я не заметил ваших комментариев раньше. Я обновил свой ответ. – NightOwl888

4

Я столкнулся с чем-то подобным. Я должен был сделать 2 вещи:

  1. указать параметр settlementID маршрута родительского узла Item в атрибуте ItemDetails дочернего узла preservedRouteParameters. В соответствии с docs inheritedRouteParameters не хватит:

    <mvcSiteMapNode title="Maschine" controller="Machine" action="Index" preservedRouteParameters="settlementID,sectionID"/> 
    
  2. Убедитесь, что все preservedRouteParameters присутствуют в способе действия. Я не уверен, что ваш ItemsDetails метода действия выглядит, но это должно выглядеть примерно так:

    public ActionResult Index(int settlementID, int sectionID) 
    { 
        //.... 
    } 
    

Надеется, что это помогает ...

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