none
Menu HTML RRS feed

  • 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
    sexta-feira, 17 de maio de 2013 15:17

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.

    sexta-feira, 17 de maio de 2013 16:43
  • Obrigado pelo retorno Fábio, a conversão c# vb.net falhou, rsrs

    Abaixo o retorno e a tabela MenuItem:


    sexta-feira, 17 de maio de 2013 17:20
  • Obrigado pelo retorno Fábio, a conversão c# vb.net falhou, rsrs

    Abaixo o retorno e a tabela MenuItem:



    sexta-feira, 17 de maio de 2013 17:20
  • Olá,

    O problema agora está na lista lstMenu que você usou na consulta LINQ... a princípio esta lista está vazia...

    Att,


    Fabio Rosa.

    sexta-feira, 17 de maio de 2013 19:14
  • Olá Fabio,

    então, a tabela do select está acima com os seus registros e as tabela pemissões abaixo, eu as tenho com conteúdo, ou estou equivocado quanto ao problema que referiu?

    segunda-feira, 20 de maio de 2013 11:05
  • OK, sua tabela tem conteúdo. Então verifique no método que faz o Reader, e alimenta a tabela se está adicionando na lista os registros.

    Att,


    Fabio Rosa.

    segunda-feira, 20 de maio de 2013 12:42
  • Fábio,

    fazendo um BreakPoint na linha  While _objSqlDataReader.Read(), parece-me que retorna carregando:

    segunda-feira, 20 de maio de 2013 12:55
  • 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 Function


    Fabio Rosa.

    segunda-feira, 20 de maio de 2013 13:26
  • Então, eu gostaria de entender este código também, pois eu apenas fiz a conversão para VB e poucas alterações do site: http://www.milaneze.com.br/post/2011/11/20/ASPNET-Menu-Recursivo.aspx.

    Retirando o trecho sugerido, o retorno:

    segunda-feira, 20 de maio de 2013 13:36
  • Hum... acho que vou ter que baixar o exemplo para verificar...

    Att,


    Fabio Rosa.

    terça-feira, 21 de maio de 2013 02:38