Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Patricia 1

Gerar Menu com dados do banco - utilizando componente Menu

Recommended Posts

Bom dia a todos

 

estou testando o componente Menu da aba "Navigation". Verifiquei que consigo gerar um menu utilizando um arquivo SiteMap (que é como um xml) porém no meu caso o menu muda de acordo com as permissões do usuário. Como estou iniciando, gostaria da ajuda de você´s.

 

Oque estou fazendo:

Pensei em utilizar o master page (com imagens e componente de menu) para definir o padrão das páginas e criar várias páginas que utilizem essa master sendo uma para cada tipo de usuário (por que cada tipo de usuário terá itens diferentes para visualizar na página além do padrão). Quando a página do tipo de usuário for solicitada, terá que montar o menu do usuário, conforme sua permissão. A dúvida é como fazer isso ? Como passo a diante os dados que o usuário é do tipo "tal" e tem perfil "tal" ?

 

No banco de dados tenho as tabelas: usuário, perfil, telas(programas), perfilacesso(quais telas o perfil tem acesso) e visão (define o tipo de visualização que o usuário terá na página) . Cada visão tem n perfis e um perfil pertence a uma única visão.

 

Como faria para "montar" o menu, de acordo com as permissões do usuário ? Teria que colocar no banco os dados a sequencia do menu ? Ou seria de outra forma ?

 

Alguém teria algum exemplo de como realizar isso, de forma que eu utilize o componente menu ?

 

A principio pensei em colocar no banco:

 

 

 

Tabela Usuario

id i d visao id perfil login senha

-------------------------------------------------------------------

1 1 3 ca lele

2 1 5 di nono

3 2 1 bu tata

 

Tabela Visao

idvisao descricao

-------------------------------

1 Funcionario

2 Cliente

 

 

Tabela Perfil

idperfil idvisao descrição

---------------------------------------

1 2 Cliente ABC

1 1 Supervisor

2 1 Atendente

 

 

Tabela Tela /* que seria os menus */

 

idtela idvisao descrição nivel idmenu programa

--------------------------------------------------------------------------------------------------

1 1 Cadastros 1 null null

2 1 Cliente 2 1 bbb.aspx

3 1 Funcionário 2 1 null

4 1 Funcionario ext 3 3 ccc.aspx

5 1 Funcionario Int 3 3 eee.aspx

6 2 Relatorio 1 null null

7 2 Mensal 2 6 fff.aspx

 

Tabela PerfilAcesso (Quais telas o usuario tem acesso de acordo com seu perfil e visao)

 

idvisao idtela idperfil

----------------------------------------

1 2 1

1 4 1

1 5 1

1 2 2

2 7 1

 

 

Assim eu iria montar o menu acessando a tabela perfilacesso c/ inner join com a tabela Telas.. porém como vou, por exemplo, buscar o menu ("Funcionarios" ) para a tela 4 ("Funcionario Ext") do perfil 1 visao 1 ? (Como montar ?)

 

 

 

Obrigada

Patricia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Patricia 1,

 

Eu tenho alguns projetos que funcionam desta forma e fiz da seguinte maneira:

 

Criei uma tabela com os itens do menu e nesta tabela tem uma coluna que informa o nivel de usuario que pode acessar determinada página.

Montei um menuzão com todas as opções que estariam disponivel somente a nivel master e depois fui alterado cada item para o nivel minimo tipo

home: nivel 0 ou seja qualquer um

cadastro: nivel 3 - semente usuarios com senha nivel 3 pra cima e assim por diante.

 

Montei o class menu.cs que traz da base de dados o menu conforme o nivel de senha do usuario no momento do login

criei o componente menu usando o webcontrol e ele fica na masterpage.

 

Para o sistema nao ficar em loop (eu nao o componente login) eu monto a pagina de login com o mesmo layout da masterpage e no code-behind do login eu faço a autenticação do usuario trazendo no menu somente as opções disponíveis para ele.

 

É possivel sim fazer o que voce menciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá

No meu caso, os usuários não seriam divididos por níveis pois para cada visão teria varios perfis, sendo que não necessariamente o perfil de um cargo superior tem acesso a todos os items de um cargo inferior. Mas obrigada pela dica.

 

Estou fazendo agora a tabela "Tela " com os campos :

 

idtela idvisao menu menusub menusub2 programa

 

Dessa forma limito os níveis do menu para 3, o que atende meu problema porém da forma como eu estava pensando anteriormente, o menu teria n niveis. Bom, vou fazer dessa forma (com 3 niveis ) e se der certo posteriormente tento melhorar :)

 

Sobre manipular o componente Menu, via código, descobri o seguinte :

 

- considerando o componente Menu, renomeado como MnuPrincipal

//Gera item "menu"
MenuItem MenuRaiz = new MenuItem();
MenuRaiz.Text = "Empresa";

//insere no componente
MnuPrincipal.Items.Add(MenuRaiz);

//Gera mais 1 item de "menu"
MenuItem MenuRaiz2 = new MenuItem();
MenuRaiz2.Text = Relatórios";
MnuPrincipal.Items.Add(MenuRaiz2);

//Gera mais 1 item de "menu" com filho 
MenuItem MenuRaiz3 = new MenuItem();
MenuRaiz3.Text = "Cadastros";

MenuItem SubMenu = new MenuItem();
SubMenu.Text = "Cliente";

MenuRaiz3.ChildItems.Add(SubMenu);

MenuItem SubMenu2 = new MenuItem();
SubMenu2.Text = "Funcionario";

MenuRaiz3.ChildItems.Add(SubMenu2);
MnuPrincipal.Items.Add(MenuRaiz3);

Quando finalizar meus testes vou postar o loop para gerar o menu.

 

Pessoal, alguem teria ideia de como deixar o design do menu como o toolbox do Visual Studio ?

 

T+

 

Patricia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal

 

como disse, segue como esta o codigo do menu até agora. Tive que usar umas variaveis (como DescMenuAtual) pois quando era nulo o valor da descrição dava erro e ainda não sei resolver isso.

 

CODE

if (dtr.HasRows)

{

//define variaveis que iremos utilizar

int IdPrograma;

string DescMenu, DescMenuAtual, DescMenuSub, DescMenuSub2;

Boolean NotEof = dtr.HasRows;

IdPrograma = dtr.GetOrdinal("PROGRAMA");

 

while (dtr.Read())

{

DescMenu = dtr["Menu"].ToString();

DescMenuAtual = dtr["Menu"].ToString();

 

while ((DescMenu == DescMenuAtual) && (NotEof))

{

//Verifica se tem descrição em menusub

DescMenuSub = dtr["MENUSUB"].ToString();

 

//Cria item de menu

MenuItem Menu = new MenuItem();

Menu.Text = DescMenu;

 

//Se não tem, significa que o acesso ao programa será no primeiro nível

if (DescMenuSub == "") Menu.NavigateUrl = dtr.GetString(IdPrograma);

 

//insere no componente

MnuPrincipal.Items.Add(Menu);

 

while ((DescMenu == DescMenuAtual) && (DescMenuSub != "") && (NotEof))

{

//verifica se possui menusub2

DescMenuSub2 = dtr["MENUSUB2"].ToString();

 

//possui MenuSub, então cria subitem

MenuItem MenuSub = new MenuItem();

MenuSub.Text = DescMenuSub;

 

//Se não tem DescMenuSub2 significa que o acesso ao programa será no segundo nível

if (DescMenuSub2 == "")

MenuSub.NavigateUrl = dtr.GetString(IdPrograma);

 

//insere

Menu.ChildItems.Add(MenuSub);

while ((DescMenu == DescMenuAtual) && (DescMenuSub == dtr["MENUSUB"].ToString()) &&

(DescMenuSub2 != "") && (NotEof))

{

//possui MenuSub2, então insere

MenuItem MenuSub2 = new MenuItem();

MenuSub2.Text = DescMenuSub2;

MenuSub2.NavigateUrl = dtr.GetString(IdPrograma);

MenuSub.ChildItems.Add(MenuSub2);

 

NotEof = dtr.Read();

DescMenuSub2 = dtr["MENUSUB2"].ToString();

}

 

if (DescMenuSub == dtr["MENUSUB"].ToString())

{

NotEof = dtr.Read();

}

 

if (NotEof)

{

DescMenuSub = dtr["MENUSUB"].ToString();

DescMenuAtual = dtr["MENU"].ToString();

}

}

DescMenu = DescMenuAtual;

}

}

}

 

 

 

Bom, não encontrei como verificar se ainda tinha registro, pois estou acostumada a utilizar o Delphi, que tem um clientDataSet e podemos dar um next ...que a leitura é automatica dentro dos loops. Aqui tenho que utilizar o read() ... e não consegui entender como controlar isso com loop dentro de loop por esse motivo acabei criando a variave NotEof .. até que eu consiga melhorar. Ou seja:

 

 

Se alguém tiver alguma sugestão de melhora agradeço :)

 

Para quem esta iniciando, espero ter ajudado a dar uma luz no fim do tunel ...rs...

 

 

 

T+

Patricia

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.