Inquiridor
Menu HTML

Pergunta
-
Alguém teria alguma sugestão para que possa complementar meus estudos?
Na implentação do código abaixo tendo como autoria primária:
http://www.milaneze.com.br/post/2011/11/20/ASPNET-Menu-Recursivo.aspx
Não sei como resolver o erro que retorna "Type 'var'is not defined"
A Class MenuItem não define a "var"? Como interpretar?
Abaixo imagens das tabelas e linha de erro:
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1_Menu_literal.aspx.vb" Inherits="WRB.View.WebForm1_Menu_literal" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtIDUsuario" runat="server"></asp:TextBox>
<asp:Button ID="btnCarregarMenu" runat="server" Text="Button"
onclick="btnCarregarMenu_Click" />
<br /><br />
<asp:Literal ID="ltrMenu" runat="server"></asp:Literal>
</div>
</form>
</body>
</html>
Imports System.Collections.Generic
Imports System.Linq
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Text
Partial Public Class WebForm1_Menu_literal
Inherits System.Web.UI.Page
Private _lstMenu As List(Of MenuItem)
Protected Sub Page_Load(sender As Object, e As EventArgs)
End Sub
Private Function Menu(IDUsuario As Integer) As String
' recuperando o menu que o usuário tem acesso
_lstMenu = SelectMenu(IDUsuario)
' chamando o método recursivo primeiro com os itens que têm o pai como NULL
Return GerarMenu(_lstMenu.Where(Function(ml) ml.ID_Item_Pai Is Nothing).ToList())
End Function
Private Function GerarMenu(Menu As List(Of MenuItem)) As String
Dim _strLista As String = "<ul>"
For Each item As var In Menu
_strLista += String.Format("<li><a href=""{0}"">{1}</a>{2}</li>", item.Link, item.Descricao, GerarMenu(_lstMenu.Where(Function(ml) ml.ID_Item_Pai = item.ID_Item).ToList()))
Next
_strLista += "</ul>"
Return _strLista
End Function
Private Function SelectMenu(IDUsuario As Integer) As List(Of MenuItem)
Dim _sbSQL As New StringBuilder()
_sbSQL.AppendLine("SELECT ")
_sbSQL.AppendLine(vbTab & " M.ID_Item")
_sbSQL.AppendLine(vbTab & ", ID_Item_Pai")
_sbSQL.AppendLine(vbTab & ", M.Descricao")
_sbSQL.AppendLine(vbTab & ", M.Link")
_sbSQL.AppendLine(vbTab & ", M.Ordem")
_sbSQL.AppendLine(vbTab & "FROM ")
_sbSQL.AppendLine(vbTab & vbTab & "dbo.Menu M")
_sbSQL.AppendLine(vbTab & vbTab & "JOIN Permissoes_Menu PM")
_sbSQL.AppendLine(vbTab & vbTab & vbTab & "ON M.ID_Item = PM.ID_Item")
_sbSQL.AppendLine(vbTab & "WHERE")
_sbSQL.AppendLine(vbTab & vbTab & "PM.ID_Usuario = @ID_Usuario")
_sbSQL.AppendLine(vbTab & "ORDER BY")
_sbSQL.AppendLine(vbTab & vbTab & "M.ID_Item_Pai, M.Ordem, M.Descricao")
Dim _objSqlConnection As SqlConnection = New SqlConnection()
_objSqlConnection.ConnectionString = My.Settings.cn1
_objSqlConnection.Open()
Dim _objSqlCommand As New SqlCommand(_sbSQL.ToString(), _objSqlConnection)
_objSqlCommand.Parameters.AddWithValue("@ID_Usuario", IDUsuario)
Dim _objSqlDataReader As SqlDataReader = _objSqlCommand.ExecuteReader()
Dim _lstMenuItem As New List(Of MenuItem)()
While _objSqlDataReader.Read()
Dim _objMenuItem As New MenuItem()
_objMenuItem.ID_Item = Convert.ToInt32(_objSqlDataReader("ID_Item"))
Dim ID_Item_Pai As Object = _objSqlDataReader("ID_Item_Pai")
If ID_Item_Pai Is DBNull.Value Then
_objMenuItem.ID_Item_Pai = Nothing
Else
_objMenuItem.ID_Item_Pai = Convert.ToInt32(ID_Item_Pai)
End If
_objMenuItem.Descricao = _objSqlDataReader("Descricao").ToString()
_objMenuItem.Link = _objSqlDataReader("Link").ToString()
Dim Ordem As Object = _objSqlDataReader("Ordem")
If Ordem Is DBNull.Value Then
_objMenuItem.Ordem = Nothing
Else
_objMenuItem.Ordem = Convert.ToInt32(Ordem)
End If
_lstMenuItem.Add(_objMenuItem)
End While
Return _lstMenuItem
End Function
Protected Sub btnCarregarMenu_Click(sender As Object, e As EventArgs)
ltrMenu.Text = Menu(Convert.ToInt32(txtIDUsuario.Text))
End Sub
Public Class MenuItem
Public ID_Item As Integer
Public ID_Item_Pai As System.Nullable(Of Integer)
Public Descricao As String
Public Link As String
Public Ordem As System.Nullable(Of Integer)
End Class
End Class
- Tipo Alterado Wilson Boris sexta-feira, 17 de maio de 2013 15:51 adequaçào
Todas as Respostas
-
Olá,
No lugar e "var" use o tipo "MenuItem" que é o tipo da lista. O var apenas funciona com C#, que significa um tipo variável, ou seja, ele assumo o tipo do valor que você colocar nele... No VB .NET tipos variáveis são declarados sem o "As"... tipo: "Dim v1" apenas. Mas pelo que vi, voc~^e está percorrendo uma lista de MenuItems, então pode usar o tipo MenuItem .
Att,
Fabio Rosa.
-
-
-
-
-
-
-
OK, então está alimentando...
Agora estava olhando novamente seu código... e fiquei na dúvida do porque ter a recursividade do método GerarMenu. A princípio, você percorre todos os itens do menu e monta em uma lista de links (HTML).... por que você chamada dentro do String.Format novamente o método GerarMenu?? Acho que isso não precisa.. e pode ser aí que esteja se perdendo.... pois parece que está tentando montar dentro de um item em HTML a mesma lista de novo e assim em loop..
Private Function GerarMenu(Menu As List(Of MenuItem)) As String
Dim _strLista As String = "<ul>"
For Each item As var In Menu
_strLista += String.Format("<li><a href=""{0}"">{1}</a>{2}</li>", item.Link, item.Descricao, GerarMenu(_lstMenu.Where(Function(ml) ml.ID_Item_Pai = item.ID_Item).ToList()))
Next
_strLista += "</ul>"
Return _strLista
End FunctionFabio Rosa.
-
-