SiteMapResolve不会触发

时间:2011-08-05 10:31:21

标签: asp.net

我遇到麻烦,SiteMapResolve会在某些页面上触发,而在其他页面上则不会。

这是我的代码。

protected void Page_Load(object sender, EventArgs e)
{
     SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ChangeMapPath);
}

private SiteMapNode ChangeMapPath(Object sender, SiteMapResolveEventArgs e)
{
    if (SiteMap.CurrentNode != null)
    {
        // Clone the current node and all of its relevant parents.
        SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
        SiteMapNode tempNode = currentNode;

        if (clientId != 0 && tempNode.Title.Equals("Client Notes"))
        {
            tempNode.Url = tempNode.Url + EncryptQueryString("ParentId=" + clientId.ToString());
        }
        if (clientId != 0 && tempNode.ParentNode != null && (tempNode.ParentNode.Title.Equals("Client Contacts")))
        {
            tempNode.ParentNode.Url = tempNode.ParentNode.Url + EncryptQueryString("ParentId=" + clientId.ToString());
        }
        else if (tempNode.ParentNode != null)
            tempNode.ParentNode.Url = tempNode.ParentNode.Url;

        return currentNode;
    }
    return null;
}

感谢。

3 个答案:

答案 0 :(得分:4)

尝试替换您的代码

SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ChangeMapPath);

foreach (SiteMapProvider mapProvider in SiteMap.Providers)
{
    mapProvider.SiteMapResolve += ChangeMapPath;
}

答案 1 :(得分:1)

我知道这是一个老问题,但万一其他人仍在处理此问题,以下解决方案适用于我。

SiteMapResolveEventHandler似乎没有被删除的问题,因此添加的第一个事件处理程序将是在该点之后被调用的事件处理程序。

https://blogs.msdn.microsoft.com/asiatech/2012/11/29/asp-net-case-study-sitemapresolveeventhandler-memory-leakage/

因此,您可以完全按照原始海报所做的操作,但您还需要将以下内容添加到添加SiteMapResolveEventHandler的每个页面。

protected void Page_UnLoad(object sender, EventArgs e)
{
    SiteMap.Provider.SiteMapResolve -= new SiteMapResolveEventHandler(this.ChangeMapPath);
}

如果您在前一页上强行删除,它应该在每个页面上调用相应的处理程序。

或者,您可以放置​​

,而不是使用Page_Unload
SiteMap.Provider.SiteMapResolve -= new SiteMapResolveEventHandler(this.ChangeMapPath); 

ChangeMapPath方法开头的代码行。

答案 2 :(得分:0)

对我更有帮助,更容易理解/维护:

使用处理程序方法创建一个接口:

public interface ISiteMapResolver
{
    SiteMapNode SiteMapResolve(object sender, SiteMapResolveEventArgs e);
}

订阅global.asax

Application_Start方法中的每个事件
foreach (SiteMapProvider siteMapProvider in SiteMap.Providers)
    siteMapProvider.SiteMapResolve += Provider_SiteMapResolve;
}

然后实现此方法

SiteMapNode Provider_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{  
     var handler = e.Context.CurrentHandler as ISiteMapResolver;
         return handler != null ? handler.SiteMapResolve(sender, e) : null;
}

这样您就可以在感兴趣的每个页面中实现ISiteMapResolver来修改节点,例如

public SiteMapNode SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
    if (SiteMap.CurrentNode == null) return null;
    var node = SiteMap.CurrentNode.Clone(true);

    node.Url += "?productId=" + ProductId; // Access page property, no problem. Page_Load event already fired.
    note.Title = "Product " + Product;

    // Modify node.ParentNode here if needed.

    return node;
}