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" />
< FONT>siteMapNode>
< FONT>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" />
< FONT>siteMapNode>
< FONT>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
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo