Поведение SiteMap - PullRequest
       6

Поведение SiteMap

0 голосов
/ 10 марта 2009

Я внимательно изучил загрузку документации MS только для того, чтобы найти древовидное представление, похожее на структуру, для использования файлов Sitemap. Я не думаю, что кто-нибудь знает о том, как можно иметь структуру в виде папок для навигации по карте сайта? Возьмем, к примеру, следующую структуру

Home
   About
      Me.aspx
      MyFamily.aspx
      MyPets.aspx
   Contact
      Telephone.aspx
      Email.aspx
 Disclaimer.aspx

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

Home >
Disclaimer

Тогда нажмите на дом, и вы получите

About >
Contact >

Тогда при нажатии на о вы получите

Me
My Family
My Pets

В каждом меню есть меню «вверх» для возврата из папки.

Я не вижу простого решения, но в данный момент мы используем статические html-страницы, которые находятся в разных папках по всему нашему веб-приложению. Это то, что нужно изменить, как вы можете себе представить.

Есть идеи?

EDIT

Мне пришлось придумать решение VB.NET

<script runat="server">
  Private Function GetSecondaryNavItems() As String
    Dim sRet As String = ""

    Dim oCurrNode As System.Web.SiteMapNode = Nothing
    Dim oCurrParentNode As System.Web.SiteMapNode = Nothing

    'Dim sCurrPage As String = GetURL(Request.ServerVariables("SCRIPT_NAME").ToLower())
    Dim sCurrPage As String = GetURL(HttpContext.Current.Request.ServerVariables("SCRIPT_NAME").ToLower())
    oCurrNode = GetCurrentNode(sCurrPage, SiteMap.RootNode)

    If Not oCurrNode Is Nothing Then
      oCurrParentNode = oCurrNode.ParentNode
    End If

    If Not oCurrParentNode Is Nothing Then
      If Not oCurrParentNode Is SiteMap.RootNode Then
        sRet += "Parent Folder Link"

        If Not oCurrNode Is Nothing Then
          For Each oChild As SiteMapNode In oCurrParentNode.ChildNodes
            sRet += "Link for child"
          Next
        End If
      End If
    End If

    Return sRet
  End Function

  Private Function GetURL(ByVal fullURL As String) As String
    Return fullURL.Substring(fullURL.LastIndexOf("/"))
  End Function

  Private Function GetCurrentNode(ByVal _sCurrentPageURL As String, ByVal _oNode As SiteMapNode) As SiteMapNode
    Dim oNodeRet As SiteMapNode = Nothing

    For Each oNodeCheck As SiteMapNode In _oNode.ChildNodes
      If oNodeCheck.HasChildNodes = True Then
        oNodeRet = GetCurrentNode(_sCurrentPageURL, oNodeCheck)
      End If

      If oNodeRet Is Nothing Then
        Exit For
      End If

      Dim sURL As String = oNodeCheck.Url.ToLower()
      Dim iPos As Integer = sURL.IndexOf("?")

      If iPos > 0 Then
        sURL = sURL.Substring(0, iPos)
      End If

      iPos = sURL.LastIndexOf("/")

      If iPos > 0 Then
        sURL = sURL.Substring(iPos)
      End If

      If sURL = _sCurrentPageURL Then
        oNodeRet = oNodeCheck
        Exit For
      End If
    Next

    Return oNodeRet
  End Function
</script>

Это непосредственно в файле мастер-страницы (временно, я добавлю его в код модели).

Я получил это в теле

<div id="sidebar">
  <%= GetSecondaryNavItems() %>
</div>

Опять временно только для проверки. На самом деле ничего не выводится, но я думаю, что мое определение GetURL неверно. Я предполагал, что это просто получение фактического файла? Я могу быть очень неправ, хотя:)

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ : По какой-то причине я не получаю никакого вывода, поэтому я подумал, что это моя карта сайта. Мне нужно отладить его, но я сейчас удаленно, поэтому он довольно медленный;)

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="Accounts/Default.aspx" title="Accounts"  description="Accounts">
    <siteMapNode url="Accounts/Test.aspx" title="Client Balances" description="Client Balances">
      <siteMapNode url="Hello.aspx" title="Hello"  description="rarar" />
      <siteMapNode url="Hiya.aspx" title="Hiya"  description="rarar" />
    </siteMapNode>
    <siteMapNode url="Test.aspx" title="Test"  description="rarar" />
  </siteMapNode>
</siteMap>

Вот пример карты сайта.

Ответы [ 2 ]

1 голос
/ 16 марта 2009

Пока я не должен отвечать, я бы на самом деле попросил кое-что еще об этом. Можно ли сделать то же самое, но с использованием страницы, которая состоит просто из элементов <ul> и <li>? Причина, по которой я спрашиваю, заключается в том, что наша «карта сайта» на самом деле более продвинута с точки зрения как безопасности, так и функциональности. Меню, которые мы запускаем, на самом деле имеют динамические выпадающие списки с полями ввода, это невозможно скопировать в карте сайта.

Итак, идея состоит в том, чтобы делать то же самое, кроме

<ul>
   <li>
      <ul>
         <li></li>
      </ul>
   </li>
   <li></li>
   <li></li>
</ul>

структура вместо. Корневой узел должен иметь на нем runat = "server", чтобы вы могли обойти все дочерние элементы? Таким образом, я могу поместить что-нибудь в свои элементы <li> и </li>.

Наша безопасность тоже довольно спорадическая, что-то такое, что у карты сайта нет того детального контроля, который мы ищем.

1 голос
/ 10 марта 2009

Вы по-прежнему можете использовать файл Sitemap.sitemap для управления вашей навигацией, но вы не используете встроенные элементы управления в asp.net для достижения этой цели. Я только что сделал почти то же самое на сайте, который только что закончил.

Сделайте так, чтобы все ваши страницы наследовали от базового класса страниц (или используйте главные страницы, в любом случае у вас будет только 1 копия вашего кода.)

Создать div или span на каждой странице, назвав что-нибудь подходящее (divNav или spnNav или что-то еще).

На вашей базовой странице при загрузке страницы выполните цикл по всем узлам карты сайта, чтобы найти узел текущей страницы. Это должен быть рекурсивный вызов.

    // Pass the current page url, all the way through the .aspx.  In other words, do NOT pass any kind of 
    // query string.
    private SiteMapNode GetCurrentNode(string _sCurrentPageURL, SiteMapNode _oNode)
    {
        SiteMapNode oNodeRet = null;

        foreach (SiteMapNode oNodeCheck in _oNode.ChildNodes)
        {
            if (oNodeCheck.HasChildNodes == true)
            {
                oNodeRet = GetCurrentNode(_sCurrentPageURL, oNodeCheck);
            }

            if (oNodeRet != null)
                break;

            string sUrl = oNodeCheck.Url.ToLower();
            int iPos = sUrl.IndexOf("?");
            if (iPos > 0)
                sUrl = sUrl.Substring(0, iPos);
            iPos = sUrl.LastIndexOf("/");
            if (iPos > 0)
                sUrl = sUrl.Substring(iPos);

            if (sUrl == _sCurrentPageURL)
            {
                oNodeRet = oNodeCheck;
                break;
            }
        }
        return oNodeRet;
    }

Как только у вас будет текущий узел, получите его родителя.

Добавьте ссылку («меню вверх, чтобы вернуться в папку», как вы ее назвали).

Затем выполните foreach (SiteMapNode в parent.ChildNodes)

Добавить ссылку для каждого из детей.

Итак, наш основной вызов, который мы вызывали при каждой загрузке страницы, был таким:

    public string GetSecondaryNavItems()
    {
        string sRet = "";

        // Get the node that matches most of this url...
        System.Web.SiteMapNode oCurrNode = null;
        System.Web.SiteMapNode oCurrParentNode = null;

        string sCurrPage = GetURL(Request.ServerVariables["SCRIPT_NAME"].ToLower());

        oCurrNode = GetCurrentNode(sCurrPage, SiteMap.RootNode);

        if(oCurrNode != null)
            oCurrParentNode = oCurrNode.ParentNode;

        if(oCurrParentNode != null)
              if(oCurrParentNode != SiteMap.RootNode)
                  sRet += "Parent Folder link";

            if(oCurrNode != null)
            {
            foreach (System.Web.SiteMapNode oChild in oCurrParentNode.ChildNodes)
            {
                    sRet += "Link for child";
              }
        }
    }

Я должен сказать вам, что приведенный выше код частично скопирован и частично от руки. Но я думаю, это должно дать вам хорошее начало.

РЕДАКТИРОВАТЬ: Простите! Вот процедура GetURL ...

    public string GetURL(string _sURL)
    {
        string sRet = _sURL;

        int iPos = sRet.IndexOf("?");
        if (iPos > 0)
            sRet = sRet.Substring(0, iPos);
        iPos = sRet.LastIndexOf("/");
        if (iPos > 0)
            sRet = sRet.Substring(iPos);

        return sRet;
    }
...