0

在我正在使用的 SiteMap 控件中,我希望我的 2 个或更多节点指向同一页面。

 <siteMapNode url="~/Default.aspx" title="Home"  description="Home page">
  <siteMapNode url="~/SectionList.aspx" title="By section"  description="List of sections">
    <siteMapNode url="~/BrowsePublications.aspx" title="publications of section"  description="Publications of section"/>
  </siteMapNode>
  <siteMapNode url="~/Officers.aspx" title="By responsible officer"  description="List of officers">
    <siteMapNode url="~/BrowsePublications.aspx" title="publications of officer"  description="Publications of officer"/>
  </siteMapNode>
</siteMapNode>

我基本上有一个网格要显示,这个网格可以通过多种方式进行过滤。每个过滤器都是一个页面,用户单击某个条目并被重定向到显示带有与该条目相关的数据的网格的页面。我正在使用查询字符串参数来实现这一点。我在网上读到,克服此限制的一种方法是将虚拟参数或“#”附加到重复节点的 url 的末尾,所以我尝试了这个

 <siteMapNode url="~/Default.aspx" title="Home"  description="Home page">
  <siteMapNode url="~/SectionList.aspx" title="By section"  description="List of sections">
    <siteMapNode url="~/BrowsePublications.aspx?view=2" title="Publication view 1"  description="Publication view"/>
  </siteMapNode>
  <siteMapNode url="~/Officers.aspx" title="By responsible officer"  description="List of officers">
    <siteMapNode url="~/BrowsePublications.aspx?view=3" title="Publication view"  description="Publication view"/>
  </siteMapNode>
</siteMapNode>

并且还使用哈希,但是由于我使用查询参数重定向到 BrowsePublications.aspx,(我的网址类似于

BrowsePublications.aspx?view=2&c=24

asp.net 无法识别它,当我尝试从 BrowsePublications.aspx 访问 SiteMap.CurrentNode 时出现异常什么是实现此目的的最简单方法。谢谢

4

1 回答 1

0

我挣扎了一段时间来做你所要求的。有一种有效且更简单的方法可以在不同的站点地图节点中拥有 2 个相同的 url(具有不同的查询字符串)。想发布解决方案,以便将来的任何人都可以从中受益。

首先,您需要站点地图中已经存在一个父节点和一个父父节点。

<siteMapNode title="" description="" url="" >
        <siteMapNode title="ParentParentTest2" description="" url="~/ParentParentTest2.aspx" >       
           <siteMapNode title="ParentTest2" description="" url="~/ParentTest2.aspx" >
           <siteMapNode title="Page_that_needs_to_be_in_multiple_Nodes" description="" url="~/XYZ.aspx" />         
    </siteMapNode>
        </siteMapNode>

        <siteMapNode title="ParentParentTest2" description="" url="~/ParentParentTest2.aspx"  >
           <siteMapNode title="ParentTest2" description="" url="~/ParentTest2.aspx">
////you don't have to add the ~/XYZ.aspx  node again. If you add it then you will get a multiple node exception.
           </siteMapNode>
         </siteMapNode> 

    </siteMapNode>

//Copy this code in master page Page_Load event
SiteMap.SiteMapResolve += SiteMap_SiteMapResolve;

///将此事件处理程序添加到母版页。

  public SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
            {

               //get current node
                SiteMapNode currentNode = SiteMap.CurrentNode;
                if (currentNode != null)
                {
                    currentNode = SiteMap.CurrentNode.Clone(true);
                    SiteMapNode tempNode = currentNode;


                        SiteMapNode nNewNode = new SiteMapNode(e.Provider,tempNode.Key);
                        switch (tempNode.Key)
                        {
                            case "/Test1.aspx":
                                    nNewNode.Clone(true);

                                    nNewNode.ParentNode.ParentNode.ReadOnly = false;
                                    nNewNode.ParentNode.ReadOnly = false;                           
    if(QueryString["Page"]="Test1")
    {    
                                    nNewNode.ParentNode.ParentNode = SiteMap.Provider.FindSiteMapNodeFromKey("~/ParentParentTest1.aspx");

                                    nNewNode.ParentNode = SiteMap.Provider.FindSiteMapNodeFromKey("~/ParentTest1.aspx");
                                    nNewNode.ParentNode.ReadOnly = false;
                                    nNewNode.ParentNode.Url = "~/ParentTest1.aspx?StateSave=true";
                                    nNewNode.ParentNode.Title = HttpContext.Current.Request.QueryString["ParentNodeName"];
                                    nNewNode.Title = HttpContext.Current.Request.QueryString["CurrentNodeName"];
    }

    if (QueryString["Page"]="Test2")
    {
    //Copy the same code and replace Test1 with Test2.
    }

    // returning the newly prepared Node.                         
                            return nNewNode;
                            default: break;

                        }

                    }

                }

                return currentNode;

            } 
于 2015-05-07T11:49:53.787 回答