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