Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, pessoal, no último artigo iniciamos um passo a passo para montar um menu dinâmico com banco de dados. Hoje vamos finalizar o exercício, que tem como objetivo ajudar a facilitar o desenvolvimento dessa solução web, que é bastante utilizada. Todo aplicativo dinâmico e com diferenciação de usuário necessita de um menu diferenciado ou de acordo com cada perfil do usuário.
Referência:
-
Ferramenta: Visual Studio .NET 2008
-
Linguagem: C#.NET
-
Banco de dados: SQL Server 2008 (mas pode ser feito em qualquer banco)
-
Componente web usado: ASP:MENU
Não deixe de ler o artigo anterior, para evitar que você tenha problemas no momento da codificação, que vamos falar nessa ultima parte.
Codificação
O primeiro passo é a parte HTML do menu. Dentro da página .aspx eu coloquei o componente menu da própria ferramenta Visual Studio .NET 2008. Coloquei também alguns Css e cores específicas:
<asp:Menu ID="MenuSistema" runat="server" DisappearAfter="4000" EnableTheming="false"
Orientation="Horizontal" Height="44px" Font-Names="Arial" Font-Bold="true">
<StaticMenuItemStyle ForeColor="#02587b" HorizontalPadding="10px" Height="28px" BorderWidth="1px"
BorderColor="Transparent" Font-Size="11pt" />
<StaticHoverStyle BackColor="Transparent" CssClass="staticHoverStyle" ForeColor="#444444"
BorderColor="#f8f8f8" BorderWidth="1px" />
<StaticSelectedStyle BackColor="#d4d4d4" ForeColor="#444444" BorderColor="Transparent"
BorderWidth="1px" />
<DynamicMenuStyle BackColor="#f5f5f5" BorderColor="#b4b4b4" BorderWidth="1px" />
<DynamicMenuItemStyle Height="28px" HorizontalPadding="15px" Width="100%" Font-Size="10pt"
ForeColor="#666666" Font-Bold="false" />
<DynamicHoverStyle ForeColor="#ffffff" CssClass="dynamicHoverStyle" BackColor="Transparent" />
</asp:Menu>*Code 1*
Não é necessário usar CSS ou cor para o menu, coloquei para ficar mais bonito e para o usuário final gostar.. O importante neste código é colocar o atributo DisappearAfter=?4000? e o EnableTheming=?false?.
Note também o id do objeto da tela, vou utilizar este mesmo nome: Id=?MenuSistema?.
No artigo anterior descrevi como preencher a sessão do menu com o select no banco de dados. Com a sessão preenchida fica fácil montar o menu. Existem alguns métodos específicos para montar o pai e o filho.
Código Load da Página
Depois de o usuário logar no aplicativo e carregar a sessão de menu, na página principal ou dentro da masterpage (que é o meu caso), eu verifico a sessão e os demais campos vindos do banco de dados.
protected string Link = "";
if (Sessao.Menu != null)
{
DataTable ItensMenu = DataTableUtil.FilterDataTable(Sessao.Menu, "ItemSeguranca=false");
foreach (DataRow ItemMenu in ItensMenu.Rows)
{
if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))
{
Link = ItemMenu["Endereco"].ToString();
}
else
{
Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";
}
MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);
if (ItemMenu["ObjetoPaiId"].ToString().Equals(""))
{
MenuSistema.Items.Add(menu);
AddSubMenuItem(menu, Sessao.Menu);
}
}
MenuItem menuSair = new MenuItem("Sair", "Sair", "", "Logout.aspx");
MenuSistema.Items.Add(menuSair);
}*Code 2*
A primeira linha verifica se a Sessao.Menu é diferente de null. Se for, eu faço um filtro para o item de segurança igual a false. O passo seguinte é fazer um foreach do item menu, que é do tipo DataRow nos ItensMenu.Rows retornados do filtro.
Dentro do for, verifico com o if se o campo do banco de dados chamado IndicadorAbertura é false, aí eu atribuo o ItemMenu com o campo Endereco à variável Link, senão eu coloco para abrir a função em javascript passando o parâmetro para abrir popup.
MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);
if (ItemMenu["ObjetoPaiId"].ToString().Equals(""))
{
MenuSistema.Items.Add(menu);
AddSubMenuItem(menu, Sessao.Menu);
}*Code 3*
Continuando, o code 3 está contido no code 2. Para adicionar o menu, gerei uma nova instância do MenuItem passando a ?Descricao", ?ObjetoId? e o Link. O passo seguinte é verificar com um if se o campo ObjetoPaiId é igual a nada, se for eu adiciono no MenuSistema (que é o id do objeto da tela) passando a variável menu e depois chamo outro método chamado AddSubMenuItem(menu, Sessao.Menu).
protected void AddSubMenuItem(MenuItem MenuPai, DataTable dtMenu)
{
foreach (DataRow ItemMenu in dtMenu.Rows)
{
if (MenuPai.Value.ToString().Equals(ItemMenu["ObjetoPaiId"].ToString()))
{
if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))
{
Link = ItemMenu["Endereco"].ToString();
}
else
{
Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";
}
MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);
MenuPai.ChildItems.Add(menu);
AddSubMenuItem(menu, Sessao.Menu);
}
}
}*Code 4*
O code 4 mostra especificamente o método AddSubMenuItem, que é responsável por adicionar um submenu dentro de um menu principal. É necessário passar o MenuItem e a Sessao.Menu (DataTable).
Dentro dele faço um for seguindo o mesmo procedimento feito no menu anterior. No final do método, exatamente na última linha, eu chamo o mesmo método passando os dados.
Você pode usar um skin para atribuir um layout legal, css, imagens e tudo mais. Lembre-se que para preencher o menu de acordo com o usuário é necessário passar o id do usuário logado e fazer o select mostrado no artigo anterior. Veja o código de como atribuir valor para a sessão:
Sessao.Menu = new ObjetoBRL().BuscaMenuDoUsuario(Sessao.UsuarioId);*Code 5*
É bem simples e fácil depois que já tenho o banco de dados. Segue a minha página completa para que tenha uma noção. Veja o Code 6 (Principal.master)
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class MeuAplicativo : System.Web.UI.MasterPage
{
protected string Link = "";
protected void Page_Load(object sender, EventArgs e)
{
if (!Sessao.UsuarioLogado || Sessao.UsuarioId.Equals(0))
{
Response.Redirect("Default.aspx");
}
if (!IsPostBack)
{
if (Sessao.Menu != null)
{
DataTable ItensMenu = DataTableUtil.FilterDataTable(Sessao.Menu, "ItemSeguranca=false");
foreach (DataRow ItemMenu in ItensMenu.Rows)
{
if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))
{
Link = ItemMenu["Endereco"].ToString();
}
else
{
Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";
}
MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);
if (ItemMenu["ObjetoPaiId"].ToString().Equals(""))
{
MenuSistema.Items.Add(menu);
AddSubMenuItem(menu, Sessao.Menu);
}
}
MenuItem menuSair = new MenuItem("Sair", "Sair", "", "Logout.aspx");
MenuSistema.Items.Add(menuSair);
}
}
}
protected void AddSubMenuItem(MenuItem MenuPai, DataTable dtMenu)
{
foreach (DataRow ItemMenu in dtMenu.Rows)
{
if (MenuPai.Value.ToString().Equals(ItemMenu["ObjetoPaiId"].ToString()))
{
if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))
{
Link = ItemMenu["Endereco"].ToString();
}
else
{
Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";
}
MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);
MenuPai.ChildItems.Add(menu);
AddSubMenuItem(menu, Sessao.Menu);
}
}
}
}Code 6
Depois da masterpage criada, basta criar a página .aspx como por exemplo (default.aspx) e indicar a master page do projeto. O resultado final é o menu montado:
/applications/core/interface/imageproxy/imageproxy.php?img=http://conteudo.imasters.com.br/19627/32998.png&key=f1ced7d2c61d4b675813cf4f648e36e48327027c0fed3591ed0766b90f407ff6" alt="32998.png" />
Bom, fico por aqui e espero que você tenha gostado. Qualquer dúvida é só entrar em contato.
Carregando comentários...