Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/11/20/ASPNET-Menu-Recursivo.aspx
Olá! Já tem algum tempo que não posto nada aqui, mas nessa semana vi um pessoal no trabalho fazendo um user control para criar um menu dinâmico. Eles chegaram numa solução, mas eu disse que tinha um outro caminho que provavelmente seria mais simples e que poderia seguir a 3NF no banco de dados. No final, acredito que o mais importante seja conseguir entregar a solução e que ela seja de fácil manutenção, mas vou mostrar aqui qual foi minha solução utilizando recursividade.
O diagrama abaixo representa a parte de banco de dados, utlizando SQL Server:
O código para geração da tabela e criação dos dados pode ser baixado aqui:
http://dl.dropbox.com/u/20361010/menu_recursivo_tabelas.sql
Como podem ver, existe uma tabela para criação do menu em si, outra para os usuários e uma outra para a criação do relacionamento n:n entre essas duas tabelas, gerando assim as permissões para os itens de menu que cada usuário terá.
Com o campo "Ordem" na tabela "Menu" e com o relacionamento citado anteriormente, é possível buscar os dados na aplicação somente visíveis para um determinado usuário e também na ordem que os itens estão configurados para aparecer. Assim não existe a necessidade nem de baixar mais dados que o necessário e nem de um processamento extra para o caso das permissões.
A aplicação é bem simples e, no meu exemplo, está somente na tela, tendo ainda que ser divida em camadas. Um trabalho que vou deixar por conta de vocês, já que não é o foco desse post.
O foco da aplicação está somente no método recursivo criado para gerar uma lista em html, num controle Literal, utilizando os dados no formato que está no banco de dados. A parte de CSS e JavaScript necessária também ficará por conta de vocês.
Aqui pode ser baixada a parte web (nesse caso, criei um Web Site):
http://dl.dropbox.com/u/20361010/Menu.rar
Note que é necessário colocar o ID do usuário no TextBox para carregar o menu dele.
Espero que tenha sido simples de entender e que tenha ajudado alguém com esse post.
Até o próximo!