2013-05-08 4 views
0

в элементе управления SiteMap, который я использую, я хочу, чтобы два или более моих узла указывали на одну страницу.несколько узлов SiteMap с одинаковым URL-адресом с параметрами querystring

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

У меня в основном есть сетка для отображения, эта сетка может быть отфильтрована разными способами. Каждый фильтр - это страница, на которой пользователь нажимает определенную запись и перенаправляется на страницу, отображающую сетку с данными, относящимися к этой записи. Для этого я использую параметры строки запроса. Я читал в Интернете, что один из способов преодолеть это ограничение является добавлением фиктивных параметров или «#» до конца URLs дубликата узлов, так что я пытался с этим

<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 с parametrs запросов (мой адрес что-то вроде

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

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

+0

Какое исключение и где в коде вы его получите? – nmat

+0

Исключение составляет «Ссылка на объект не установлена ​​в экземпляр объекта» Я получаю его, когда пытаюсь получить доступ к SiteMap.CurrentNode внутри BrowsePublications.aspx.cs , если я удалю это, я не получаю исключение, но мой контроль над файловой системой doesn Сделать ничего – kfc

+0

см. это: http://stackoverflow.com/questions/3113765/sitemap-navigation-and-query-string – nmat

ответ

0

Я долгое время пытался сделать то, что вы просили. Существует эффективный и простой способ иметь 2 одинаковых URL (с разными строками запроса) в разных узлах карты сайта. Мысль, чтобы опубликовать решение, чтобы кто-то в будущем выиграл от него.

Во-первых, вам нужен родительский узел и родительский родительский узел, уже присутствующие в файле Sitemap.

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

      } 

 Смежные вопросы

  • Нет связанных вопросов^_^