Остановить поставщика Mvc Sitemap от кэширования узлов с preservedRouteParameters - PullRequest
0 голосов
/ 11 марта 2012

В карте сайта у меня есть несколько узлов, где параметр маршрута (meetingId) включен при генерации URL, например,

<mvcSiteMapNode controller="MeetingAttendants" action="Index" title="Attendants" preservedRouteParameters="meetingId" />

Когда я просматриваю одно собрание (meetingId = 1) и переключаюсь на другое собрание (meetingId = 2), меню, созданное mvcsitemapprovider, не изменяется.

Узел выше будет генерировать URL:

Meetings/1/Attendants/

Но должно ли это быть на самом деле:

Meetings/2/Attendants

В моем узле верхнего уровня у меня есть changeFrequency = "Always":

  <mvcSiteMapNode title="Home" controller="Home" action="Index" changeFrequency="Always" updatePriority="Normal">

А в web.config у меня есть:

cacheDuration="0"

Почему узлы кэшируются? И как решить эту проблему?

1 Ответ

0 голосов
/ 05 июня 2012

Это проблема с DefaultSiteMapNodeUrlResolver, который поставляется с продуктом.Проблема возникает из-за создания экземпляра UrlHelper, который использует текущий контекст (маршрут).Вероятно, он содержит ваш идентификатор встречи для текущего запроса.

protected UrlHelper UrlHelper
    {
        get
        {
            if (HttpContext.Current.Items[UrlHelperCacheKey] == null)
            {
                RequestContext ctx;
                if (HttpContext.Current.Handler is MvcHandler)
                    ctx = ((MvcHandler)HttpContext.Current.Handler).RequestContext;
                else
                    ctx = new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData());

                HttpContext.Current.Items[UrlHelperCacheKey] = new UrlHelper(ctx);
            }
            return (UrlHelper)HttpContext.Current.Items[UrlHelperCacheKey];
        }
    }

Лучше всего написать собственный ISiteMapNodeUrlResolver и просто удалить код, вызывающий сбой, например:

protected UrlHelper UrlHelper
    {
        get
        {
            if (HttpContext.Current.Items[UrlHelperCacheKey] == null)
            {
                var ctx = new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData());

                HttpContext.Current.Items[UrlHelperCacheKey] = new UrlHelper(ctx);
            }
            return (UrlHelper)HttpContext.Current.Items[UrlHelperCacheKey];
        }
    }
...