Olá, pessoal!
Neste artigo, veremos como montar “menu” com os dados vindo diretamente do banco de dados. Sabemos que muitos aplicativos montam o seu “menu” cadastrado no banco de dados, cada um com seu perfil e sua permissão. Para isso, é necessário ter primeiro uma boa estrutura de banco de dados e campos para montá-lo.
Em momentos anteriores, escrevi outros artigos que montam “menu” diretamente de um XML, e com o componente diferente, ou seja, que precisa ser referenciado no projeto. Este artigo será um pouco diferente, pois os dados são de um banco de dados, e o componente para montar o menu é o nativo da ferramenta.
Referências:
- Visual Studio .NET 2008
- Banco de dados SQL Server
- Linguagem C#.NET
- Plataforma Web ASP.NET
Vou mostrar o banco de dados montado para que entenda desde o começo o
passo a passo, pegando os dados do menu vindo do banco de dados.
O primeiro passo é criar uma tabela no banco de dados. Dei o nome de dbo.Objeto. Essa tabela terá o menu, links, ordenação e informações necessárias para montar o menu.

O campo ObjetoId é autoincremento e o objetoPaiId é um auto-relacionamento indicando o menu principal. Por exemplo: se o “menu” for o principal, esse campo ObjetoPaiId será NULL. Para o submenu, o objetoPaiId terá um número indicando o ObjetoId. Segue a imagem preenchida para que tenha uma outra boa referência:

Produção
- Formaliza Conta
Note que, na imagem, na primeira linha, o ObjetoPaiId está NULL (o último campo da primeira linha). E que na segunda linha e no último campo existe um número referenciado, é o mesmo da primeira linha; ou seja; um auto-relacionamento.
Foram inseridos também alguns campos que, no momento, não serão utilizados, mas podem ser futuro. Os campos são ExibeImagem e URLImagem. Isso é para caso o seu menu tenha alguma imagem que precise ser mostrada.
No campo endereço, o nome da página está com a extensão. Veja que não coloquei o endereço completo, só o nome da página propriamente dito. Todas as minhas páginas estão no diretório raiz. Dessa forma, coloquei só o nome da página. Se tivesse dentro de uma pasta, colocaria o nome da pasta barra o nome da página. (Isso é só para que entenda como funciona).
O objeto que vou usar para mostrar o “menu” é o do próprio Visual Studio .NET 2008. A versão da ferramenta não importa, pois o <ASP:MENU> é o mesmo das versões anteriores.
E esse objeto funciona em todos os browsers sem qualquer problema. Pelo menos em meus testes todos abriram.
Além do objeto <ASP:MENU>, vou usar CSS e Imagens para ficar bonito o menu montado na tela.
Tabelas de vínculo
Agora, vamos ver a criação das tabelas de vínculo e um pouco de codificação em C#.NET.
Lembrando que não vamos mostrar aqui a forma de conectar ao banco de dados, nem
mesmo fazer o select para validar o usuário logado, isso porque estou partindo
do pressuposto que você sabe fazer isso. O objetivo é mostrar como carregar o
menu vindo do banco de dados de acordo com o usuário logado no sistema.
O menu precisa ser carregado de acordo com o perfil do
usuário, depois que ele entra com o usuário e senha. Dessa forma, o sistema
busca no banco de dados o perfil e com ele busca os dados no menu, que, no nosso
caso, é a tabela Objeto.
Se
o seu caso for apenas carregar o menu sem distinção de usuário, o caminho está
fácil. Mas se você precisa carregar o menu de acordo com o grupo
do usuário, é necessário criar mais algumas tabelas específicas.
Criando
tabelas para vincular o perfil do usuário
A
primeira tabela para gerar o perfil do usuário foi a Grupo.
Tabela Grupo
Campos:
- GrupoId (int) auto incremento
- Nome (varchar(60) notnull
A descrição do grupo pode ser colocada como você preferir. Na minha aplicação eu
tenho: Administrador, Usuário, Leitor.
Depois
de criar a tabela grupo, é necessário criar uma tabela chamada GrupoObjeto para
vincular a tabela Objeto com a tabela Grupo.
Tabela GrupoObjeto
Campos:
- ObjetoId
(int) notnull - GrupoId
(int) notnull
O número do menu cadastrado fica no
campo ObjetoId, e o número do grupo cadastro fica no campo GrupoId.
A
próxima tabela para criar vínculo é a usuário grupo, ou seja, vincular o
usuário cadastro ao grupo. Para isso criei a tabela chamada UsuarioGrupo.
Tabela: UsuarioGrupo
Campos:
- UsuarioId (int) notnull
- GrupoId (int) notnull
Depois
de criar estas tabelas ficou simples fazer o select. Para facilitar, vou
colocar o select abaixou para carregar o menu do usuário que acabou de logar no
sistema.
Select
que retorna o menu para o usuário
Select distinct Obj.*
From Objeto Obj
Inner join GrupoObjeto gob on obj.objetoId = gob.objetoId
Inner Join Grupo gru on gob.grupoId = gru.grupoId
Inner Join UsuarioGrupo ugp on ugp.grupoId = gru.grupoId
Where ugp.usuarioId=(NUMERO_DO_USUARIO_ID)
Order by obj.Ordem
Select 1.1
Este select retorna o menu de acordo com o
usuário logado e com ele basta construir o código para mostrar em tela.
Codificando
Agora vamos codificar o menu para ser mostrado em tela. Para facilitar,
eu vou criar uma classe chamada Sessão, que carrega todas as sessões do meu
sistema, inclusive a sessão de menu.
Esta
classe sessão só tem get e set.
public static DataTable Menu
{
get
{
try
{
return (DataTable)HttpContext.Current.Session["Session:MENU"];
}
catch
{
return null;
}
}
set
{
HttpContext.Current.Session["Session:MENU"] = value;
}
}
public static decimal UsuarioId
{
get
{
try
{
return Conversion.ToDecimal(HttpContext.Current.Session["Session:USUARIOCOD"]);
}
catch
{
return 0;
}
}
set
{
HttpContext.Current.Session["Session:USUARIOCOD"] = value;
}
}
Depois que o
usuário entrar no sistema com usuário e senha, eu preciso buscar o menu e
chamar o select 1.1. O retorno dela eu atribuo para a classe sessão atribuindo
o menu.
Sessao.Menu = new ObjetoBRL().BuscaObjetosDoUsuario(Sessao.UsuarioId);
Assim,
eu fico com a sessão menu preenchida para montar na tela.
Na próxima parte do artigo veremos o restante da codificação. Espero que tenha entendido e
gostado, qualquer dúvida pode entrar em contato.
2 Comentários
Qual a sua opinião?