O suporte à navegação é fornecido na nova versão através de um conjunto de novas funcionalidades que inclui providers e controlos capazes de efectuar muitas das operações necessárias a essa navegação(já escrevi um pouco sobre estas funcionalidades num artigo publicado no site). Actualmente existe apenas um único controlo capaz de obter os dados da navegação a partir do provider: estou a falar do controlo SiteMapPath.
Contudo, existem outros controlos que são capazes de obter dados em formato hierárquico (como por exemplo, o controlo TreeView). A ligação entre a informação fornecida pelo provider e este tipo de controlos pode ser estabelecida através do controlo SiteMapDataSource (que implementa os interfaces necessários por forma a que os dados disponibilizados possam ser consumidos por controlos que necessitam de dados em formato hierárquico ou tabular).
A propriedade StartingNodeOffset pertence ao controlo SiteMapDataSource e é utilizada para definir um offset a partir do qual irá ser devolvido o nó de início que será apresentado pelo controlo do tipo data bound (normalmente uma TreeView ou um Menu). O valor atribuído a esta propriedade pode ser positivo ou negativo. No caso da atribuição de um valor negativo, a navegação é feita no sentido ascendente (portanto, em direcção ao nó pai). Por outro lado, a atribuição de um valor positivo implica uma navegação descendente sentido dos nós filho.
Convém ter em atenção que a navegação (ascendente ou descendente) é feita sempre a partir do nó de início (e, já agora, convém também salientar que o nó de início depende dos valores atribuídos às propriedades StartFromCurrentNode e StartingNodeUrl - existe ainda a possibilidade do nó de início ser o nó raíz definido no ficheiro de web.sitemap se nenhuma das propriedades anteriores possuir um valor capaz de proceder à definição desse elemento).
Ao contrário do que possam pensar, a navegação descendente (causada pela atribuição de um valor positivo à propriedade StartingNodeOffset) é feita em sentido ascendente (quer dizer, mais ou menos...já vou explicar :) ). Para percebermos o porquê temos de ter em atenção a forma como é feita a navegação ao longo dos nós. Se pensarmos um pouco sobre o assunto, chegamos à conclusão que a navegação baseada num offset negativo é intuitiva pois cada nó apenas pode possuir um pai. Contudo, a navegação descendente já é mais problemática pois um nó pode ter mais do que um filho. Se a navegação descendente fosse efectuada da mesma forma que a ascendente iríamos ter um problema grave quando chegássemos a um nó com vários filhos. Nestas situações teríamos de escolher um nó para continuarmos a navegar até atingirmos o offset desejado. O problema é mesmo esse: qual o nó que devemos escolher?
Então qual a solução para o problema: navegar a partir do nó actual (o nó actual é definido através da página actual ) de forma ascendente até que offset seja atingido (através da execução dum ciclo simples). Quando esgotamos o ciclo temos ainda a parte final da caminhada pela frente :) é necessário obter o nó que deve ser utilizado como ponto de partida através da execução de um novo ciclo que volta a utilizar a navegação ascendente (se quiserem ver o código completo utilizem o .Net Reflector e olhem para o método GetNodes da classe SiteMapDataSource).
Os pormenores associados ao funcionamento interno não são importantes; o que é importante é perceber que o conceito normalmente associado ao offset positivo pode não corresponder ao resultado final obtido aquando da utilização desta propriedade. Por exemplo, se tivermos na página definida como raíz do ficheiro web.sitemap não iremos obter nenhum nó se atribuirmos o valor 1 à propriedade StartingNodeOffset (isto apesar de podermos ter uma hierarquia complexa com vários níveis definidos). Bom, quanto a mim a Microsoft deveria era permitir apenas offsets negativos de forma a eliminar toda esta confusão acerca da utilização desta propriedade.
posted on Thursday, March 31, 2005 9:25 PM