0

在站点地图中,我有几个节点,其中在生成 URL 时包含路由参数(meetingId),例如

<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"

节点是如何被缓存的?以及如何解决这个问题?

4

1 回答 1

0

这是产品附带的 DefaultSiteMapNodeUrlResolver 的问题。问题源于使用当前(路由)上下文的 UrlHelper 的实例化。这可能包含您当前请求的 meetingid。

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];
        }
    }
于 2012-06-05T02:43:07.387 回答