Несколько узлов SiteMap с одним URL с параметрами строки запроса

В элементе управления 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 с параметрами запроса, (мой URL-это что-то вроде

BrowsePublications.aspx? Вид =2& с = 24

asp.net не распознал его, и я получил исключение, когда попытался получить доступ к SiteMap.CurrentNode из BrowsePublications.aspx. Что является самым простым способом добиться этого. Спасибо

1 ответ

Некоторое время я пытался сделать то, что вы просили. Существует эффективный и простой способ иметь 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;

            } 
Другие вопросы по тегам