Olá pessoal, hoje gostaria de dar continuação sobre a maneira de montar o menu dinâmico com banco de dados. Lembrando que já foi publicado a primeira parte do artigo no link abaixo:

Link: http://aspneti.com/Montando+Menu+Dinamico+com+Banco+de+Dados+944,0.aspx

    No link acima, eu montei o banco de dados com os campos para melhor entendimento e falei da tabela objeto que seria usado para carregar o menu na tela. Hoje vou mostrar a criação das tabelas de vínculo e um pouco de codificação em C#.NET.
   
    Gostaria de lembrar que, não vou mostrar a forma de conectar ao banco de dados, nem mesmo fazer o select para validar o usuário logado, isso porque estou partindo do pré-suposto 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. Qualquer dúvida sobre isso, conexão, select e tudo mais, pode entrar em contato pelo site que procurarei responder.

Referência:
Visual Studio .NET 2008
Linguagem: C#.NET
Plataforma: ASP.NET
Objeto de tela utilizado: ASP:MENU.

    Para deixar bem explicado, o menu precisa ser carregado de acordo com o perfil do usuário depois que o mesmo 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 conforme a parte 1 do artigo.
    Se o seu caso for apenas carregar o menu sem distinção de usuário, o caminho está fácil. Agora para você leitor que 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.
Campos:
GrupoId (int) auto incremento
Nome (varchar(60) notnull

    Na descrição do grupo, pode ser colocado como desejar. 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
Referência: 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

    Neste capítulo, eu vou codificar o menu para ser mostrado em tela. Para facilitar, eu vou criar uma classe chamada Sessao que carrega todas as sessões do meu sistema, inclusive a sessão de menu.
    Esta classe sessão só tem get e set. Referência: code 1.2

   
    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;
        }
    }
Referência: Code 1.2

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 sessao atribuindo o menu. Referência Code 1.3.


Sessao.Menu = new ObjetoBRL().BuscaObjetosDoUsuario(Sessao.UsuarioId);
Referência: Code 1.3

    Assim eu fico com a sessão menu preenchido para montar na tela. Bom, eu fico por aqui e na parte 3 eu mostro o resto da codificação. Espero que tenha entendido e gostado, qualquer dúvida pode entrar em contato pelo site.

Obs.: resolvi dividir em partes para não ficar muito grande este artigo.