Criando Menus Baseados no Perfil de Usuário

Veja neste artigo de Carlos de Mattos, como criar menus em aplicações ASP.NET, baseado no perfil do usuário. Acesso exclusivo para Assinantes.

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.

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.

 

 

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

 

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

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados