Array
(
)

Carregar menu dinamicamente

Thomás Moreira
   - 27 jan 2012

Bom dia a todos!
Estou precisando com urgencia desenvolver uma forma de carregar os itens de um aspnet menu dinamicamente com dados vindos do banco de dados, conforme perfil do usuário. Pesquisando na net, encontrei os seguintes artigos do Maurício Junior:

http://www.ecode10.com/artigo/944/Artigo-Convertido-Temporariamente.aspx
http://www.ecode10.com/artigo/947/Artigo-Convertido-Temporariamente.aspx
http://www.ecode10.com/artigo/948/Artigo-Convertido-Temporariamente.aspx

Porem, mesmo tentando seguir o artigo, não consegui sucesso. Senti falta de mais clareza nas informações e na explicação de certas etapas do processo.
Alguem conhece esses artigos eu ja conseguiu fazer algo desse tipo?
Se alguem puder me ajudar a desenvolver essa funcionalidade, agradeço muito!
Abraços!

Thomás Moreira
   - 30 jan 2012

Galera!

Alguem ai pra ajudar??? Por favor!

Valeu!

Joel Rodrigues
   - 30 jan 2012

Não sei em que parte está sua dificuldade, mas em geral, o esquema é o seguinte:

#Código

        foreach (DataRow r in tab.Rows)
        {
            MenuItem item = new MenuItem();
            item.Text = r[TEXTO].ToString();
            item.NavigateUrl = r[URL].ToString();
            NavigationMenu.Items.Add(item);
        }


Para cada linha na tabela, supondo a existência das colunas TEXTO e URL, criamos um MenuItem e adicionamos ao menu (NavigationMenu).

Thomás Moreira
   - 30 jan 2012

A dificuldade está mais em manter os dados vindos do banco (SQL), contendo todo perfil de acesso do usuario, na sessão, para que fique mais facil acessar. Isso seria usado numa master page.

Joel Rodrigues
   - 31 jan 2012

Mostre aí estrutura das tabelas que registram o perfil do usuário e de que forma você precisa montar esse menu.

Leonardo Wintrich
   - 31 jan 2012

Primeiro criei uma estrutura de dados onde eu posso armazenar uma lista com os dados de forma estruturada(pai/filho)
#Código

public class MenuDinamico
    {
        public int itemPai { get; set; }
        public int itemId { get; set; }
        public string nmItem { get; set; }
        public string pagItem { get; set; }
        public MenuDinamico()
        {        }
    }


Depois montei uma rotina que preenche essa estrutura e armazena numa session. Provavelmente vc vai ter uma rotina dessa retornando os dados do banco de dados
#Código

private void PreencheDadosMenu()
        {
            var vLista = new List<MenuDinamico>();
            MenuDinamico vMenu = new MenuDinamico();
            vMenu.itemPai = 0;
            vMenu.itemId = 1;
            vMenu.nmItem = Produtos;
            vMenu.pagItem = ~/Produtos.aspx;
            vLista.Add(vMenu);
 
            vMenu = new MenuDinamico();
            vMenu.itemPai = 0;
            vMenu.itemId = 2;
            vMenu.nmItem = Clientes;
            vMenu.pagItem = ~/Clientes.aspx;
            vLista.Add(vMenu);
 
            vMenu = new MenuDinamico();
            vMenu.itemPai = 1;
            vMenu.itemId = 1;
            vMenu.nmItem = Produto 1;
            vMenu.pagItem = ~/Produtos1.aspx;
            vLista.Add(vMenu);
 
            vMenu = new MenuDinamico();
            vMenu.itemPai = 1;
            vMenu.itemId = 2;
            vMenu.nmItem = Produto 2;
            vMenu.pagItem = ~/Produtos2.aspx;
            vLista.Add(vMenu);
 
            vMenu = new MenuDinamico();
            vMenu.itemPai = 2;
            vMenu.itemId = 1;
            vMenu.nmItem = Clientes 1;
            vMenu.pagItem = ~/Clientes1.aspx;
            vLista.Add(vMenu);
 
            Session[Menu] = vLista;
        }


E por fim uma rotina que monta o menu de acordo com o que vem da sessão
#Código
private void MontaMenu()
        {
            var vListaMenu = (List<MenuDinamico>)Session[Menu];
 
            var vListaitem0 = from p in vListaMenu where p.itemPai == 0 select p;
            foreach (var item in vListaitem0)
            {
                //para cada item zero, adiciona item zero 
                MenuItem itemMenu = new MenuItem();
                itemMenu.Text = item.nmItem;
                itemMenu.NavigateUrl = item.pagItem;
                Menu1.Items.Add(itemMenu);
 
                //varre lista procurando filhos
                var vListaFilhos = from p in vListaMenu where p.itemPai == item.itemId select p;
                foreach (var itemFilho in vListaFilhos)
                {
                    //para cada item zero, adiciona item zero 
                    MenuItem itemMenuFilho = new MenuItem();
                    itemMenuFilho.Text = itemFilho.nmItem;
                    itemMenuFilho.NavigateUrl = itemFilho.pagItem;
                    itemMenu.ChildItems.Add(itemMenuFilho);
                }
            }
        }


Segue um print com esses métodos na masterpage

E por fim um print do resultado

Qualque duvida me mande um email que te mando o projeto todo.

Abraços

Leonardo Wintrich
   - 31 jan 2012

O email é:
Leonardowintrich@gmail.com

Thomás Moreira
   - 31 jan 2012

Bom dia Leonardo, blz?

Valeu pela atenção!

Vou fazer um teste ainda hoje com os codigos que você passou e amanha te retorno ok?

Muito obrigado!

Abraço!

Thomás Moreira
   - 14 fev 2012

Boa tarde Leonardo! Blz?

Demorei um pouco pra responder né?

Consegui fazer a parada! Aparentemente tá tudo OK.

Valeu pela força!

Abraço!