Criando Menus Baseados no Perfil de Usuário

Utilizando o Web.sitemap dinamicamente

O ASP.NET 2.0 introduziu novos controles de navegação como o SiteMapPath e o  controle Menu. Com esses controles, o desenvolvedor pode criar facilmente mecanismos de navegação para sua aplicação web armazenando a estrutura de navegação em arquivos XML. Imaginando um cenário de uma aplicação segura, seria muito produtivo se pudéssemos alimentar esses controles de navegação dinamicamente, de acordo com o perfil do usuário. Este é o propósito deste artigo. Vou demonstrar como utilizar um controle Menu e modificar seu DataSource dinamicamente utilizando as classes XmlSiteMapProvider e SiteMapDataSource.

Criando nossa aplicação de exemplo

Para ilustrar nosso artigo criaremos um novo website onde as páginas serão organizadas em pastas de acordo com o perfil do usuário. Nosso exemplo, terá três pastas distinguindo os perfis de Gerentes, Supervisores e Usuários. Cada pasta terá uma página Default.aspx. Para mantermos a organização, acrescentaremos uma pasta chamada _Sitemaps onde colocaremos os arquivos *.sitemap que serão utilizados para construir os menus dinamicamente. A Figura 1 apresenta a estrutura de diretórios da aplicação de exemplo.

img

Figura 1: Estrutura de Pastas da Aplicação

Os arquivos Sitemaps

Basicamente, um arquivo Sitemap é um arquivo XML com a extensão *.sitemap. Esses arquivos contém a estrutura de navegação do website. O nome padrão para o arquivo Sitemap é Web.sitemap. Este arquivo deve ser colocado no diretório Root da aplicação. A implementação do nosso exemplo, utilizará o atributo siteMapFile do arquivo Web.sitemap para adicionarmos quantos Sitemaps forem necessários para atender os diferentes perfis de usuários da nossa aplicação. A Listagem 1 apresenta o conteúdo do arquivo Web.sitemap.

 

Listagem 1. O conteúdo do arquivo Web.sitemap

<?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

    <siteMapNode url="Default.aspx" title="Menu Principal"  description="Menu Principal">

      <siteMapNode siteMapFile="~/_Sitemaps/Gerente.sitemap" />

      <siteMapNode siteMapFile="~/_Sitemaps/Supervisor.sitemap" />

      <siteMapNode siteMapFile="~/_Sitemaps/Usuario.sitemap" />

    siteMapNode>

siteMap>

 

Observe no código da Listagem 1 que foram utilizados os caracteres “~/” para indicar a URL do atributo siteMapFile. Estes caracteres indicam que o ASP.NET Runtime deverá procurar pela pasta _Sitemaps no diretório Root da aplicação.

Criando Diferentes Sitemaps

Para atingirmos o objetivo deste artigo, vamos criar os três arquivos *.sitemaps indicados no arquivo Web.sitemap. A Listagem 2 apresenta o conteúdo do arquivo Gerente.sitemap. Para os perfis de usuário Supervisores e Usuários utilizaremos arquivos com o mesma estrutura modificando apenas as URLs para prover a correta navegação.

 

Listagem 2. O arquivo Gerente.sitemap

<?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

<siteMapNode url="~/Gerentes/Default.aspx" title="Gerentes"  description="Menu Gerentes">

<siteMapNode url="Supervisores.aspx" title="Supervisores"  description="Gerenciar Supervisores" />

<siteMapNode url="Usuarios.aspx" title="Usuários"  description="Gerenciar Usuários" />

<siteMapNode url="RelatoriosGerenciais.aspx" title="Relatórios"  description="Relatórios" />

<siteMapNode url="PainelControle.aspx" title="Painel Controle"  description="Painel de Controle" />

<siteMapNode url="Sistema.aspx" title="Sistema"  description="Ferramentas do Sistema" />

siteMapNode>

siteMap>

 

A página Default.aspx

Para mantermos o foco deste artigo, a página Default.aspx não terá nenhuma interface, apenas um texto no cabeçalho e um único controle Menu, chamado Menu1. Precisaremos de apenas algumas linhas de código nesta página para invocarmos o método GetSiteMapDataSource da classe DynamicSiteMap. Confira o código na Listagem 3.

 

Listagem 3. O procedimento Page_Load

protected void Page_Load(object sender, EventArgs e)

{

    if (!Page.IsPostBack)

    {

        ///

        /// Não importa o método utilizado para autenticação do usuário.

        /// Basta passar o parâmetro PROFILE (string) para o procedimento

        /// GetSiteMapDataSource para exibir o menu correspondente ao

        /// perfil do usuário autenticado.

        ///

        Menu1.DataSource = DynamicSiteMap.GetSiteMapDataSource("Gerente");

        Menu1.DataBind();

    }

}

 

As Figuras 2 e 3 mostram a página Default.aspx em tempo de execução em dois momentos diferentes, a primeira com o perfil de Gerente e a outra com perfil de Supervisor. Observe as diferenças nos itens de menu.

 

img 

Figura 2: A página Default.aspx apresentado o menu com perfil de Gerente

img 

Figura 3: A página Default.aspx apresentando o menu com perfil de Supervisor

A Classe DynamicSiteMap.cs

Para finalizarmos, adicione uma nova classe à sua aplicação. Por padrão o Visual Studio 2005 sugerirá ao desenvolvedor para armazenar sua classe na pasta App_Code de forma que seus métodos possam ser acessados por toda a aplicação. Nossa classe é bastante simples e terá um único método chamado GetSiteMapDataSource. Este método utilizará as classes XmlSiteMapProvider e SiteMapDataSource para manipular o arquivo Web.sitemap dinamicamente. A Listagem 4 apresenta o código desta classe na íntegra.

 

Listagem 4. A Classe DynamicSiteMap.cs

public class DynamicSiteMap

{

 

    ///

    /// Este procedimento recebe o parâmetro PROFILE (string) que identifica

    /// o perfil do usuário, e define o nó principal do controle Menu1

    /// de acordo com esse perfil.

    ///

    public static SiteMapDataSource GetSiteMapDataSource(string profile)

    {

        // variável para armazenar a URL do nó principal do menu

        string URL = String.Empty;

 

        // define a URL de acordo com o parâmetro PROFILE

        if (profile.Equals("Gerente")) URL = "~/Gerentes/Default.aspx";

        else if (profile.Equals("Supervisor")) URL = "~/Supervisores/Default.aspx";

        else if (profile.Equals("Usuario")) URL = "~/Usuarios/Default.aspx";

      

        // cria o objeto XmlSiteMapProvider que será utilizado para construir

        // o SiteMap dinamicamente.

        XmlSiteMapProvider xmlSiteMap = new XmlSiteMapProvider();

        System.Collections.Specialized.NameValueCollection MySiteMap =

            new System.Collections.Specialized.NameValueCollection(1);

        MySiteMap.Add("siteMapFile", "Web.sitemap");

 

        // inicializa o novo objeto SiteMapProvider

        xmlSiteMap.Initialize("MyProvider", MySiteMap);

        xmlSiteMap.BuildSiteMap();

       

        // cria o DataSource para o objeto SiteMap

        SiteMapDataSource siteMap = new SiteMapDataSource();

 

        // atribui o nó principal de acordo com o perfil do usuário

        siteMap.StartingNodeUrl = URL;

       

        // oculta o nó principal (opcional)

        siteMap.ShowStartingNode = false;

 

        // retorna o objeto para o procedimento de chamada

        return siteMap;

    }

}

Conclusões

Neste artigo, o desenvolvedor acompanhou como utilizar as classes XmlSiteMapProvider e SiteMapDataSource para modificar arquivo Web.sitemap dinamicamente. Este recurso combinado com os controles de navegação do ASP.NET 2.0 permite a implementação de menus de acordo com o perfil dos usuários.

 

Links

http://msdn2.microsoft.com/en-us/library/system.web.xmlsitemapprovider.aspx

Informações sobre o XMLSiteMapProvider no MSDN Online

http://msdn2.microsoft.com/en-us/library/system.web.sitemap.aspx

Informações sobre o SiteMaps no MSDN Online

http://www.codeguru.com/csharp/csharp/cs_internet/desktopapplications/article.php/c8327__1

Artigo sobre recursos de navegação no ASP.NET 2.0 publicado no CodeGuru