MENU SUBMENU PATH MS SQL   zodpovězená otázka

VB.NET, ASP.NET WebForms, SQL, Databáze

Dobrý den mám dotaz.

Tvořím menu ve stylu:

http://62.77.84.254:8080/admin/testfilep...

Ale potřebuji toto menu načítat z SQL, čehož jsem dosáhl za pomocí: (ale je celé rozbalené)

;WITH CTE AS (
    SELECT 
        *, nadpis, CAST(ISNULL('' ,CONVERT(varchar, nadpis)) + CONVERT(varchar, nadpis)  AS VARCHAR(255)) [Path]
    FROM New_Menu_left	
    WHERE id_submenu is NULL

    UNION ALL

    SELECT 
        H.*, H.nadpis, CAST(C.[Path] + '/' + CONVERT(varchar, H.nadpis) AS VARCHAR(255)) 
    FROM New_Menu_left H		
    INNER JOIN CTE C ON C.Id = H.id_submenu
) 

SELECT * FROM CTE  ORDER BY path

a moje otázka tedy zní jak z tohoto SELECTU mam vypsat pouze kategorie a podkategorii na kterou kliknu.

TABULKA:

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[NEW_Menu_Left](
	[Id] [int] IDENTITY(5010000,1) NOT NULL,
	[Nadpis] [nvarchar](50) NULL,
	[id_submenu] [int] NULL,
	[Poradi] [nvarchar](50) NULL,
	[PoradiSub] [nvarchar](50) NULL,
	[Kategorie] [nvarchar](max) NULL,
	[PageURL] [nvarchar](50) NULL,
	[SQL] [ntext] NULL,
	[Role] [nvarchar](50) NULL,
	[Css_Text] [nvarchar](50) NULL,
	[Css_div] [nvarchar](50) NULL,
	[Icon] [nvarchar](50) NULL,
	[Icon_Visible] [nvarchar](50) NULL,
	[htaccess] [nvarchar](50) NULL,
	[Panel] [nvarchar](50) NULL,
	[Funkce] [nvarchar](50) NULL,
	[text] [ntext] NULL,
 CONSTRAINT [PK_NEW_Menu_Left] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Předpokládám, že to menu (i když ve v datech) je poměrně statická záležitost, proto bych to osobně řešil tak, že budu mít v paměti nějakou objektovou strukturu, která bude menu reprezentovat. Poprvé, když tato struktura nebude ještě načtena, tak bych z databáze načetl všechny data pro menu a tuto strukturu v paměti sestavil. Při renderování stránek by se používala již tato struktura a žádný dotaz by se do databáze nevolal. To která kategorie je zrovna vybraná se zohlední až nad tou strukturou v paměti.

Pokud to přesto chcete vždy tahat přímo z databáze, tak jednoduše vraťte to co zrovna potřebujete, tj. zvlášť kategorie a zvlášť podkategorie odfiltrované na tu jednu aktuálně vybranou kategorii podle ID (pokud je zrovna nějaká vybraná).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

vytvoreni struktury myslite toto:

Function VlozCssL(ByVal Path As String, ByVal parametr As String) As String ' Zcasti funkcni

        If Not Page.Request.QueryString.Keys.Count <= 0 Then
            If Not Page.Request.QueryString.Keys.Count <= 0 Then
                Dim pomocna_() As String = Request.QueryString("menu").ToString.Trim.Split("/")
                Dim pomocna_1() As String = Path.ToString.Split("/")

                If pomocna_1(pomocna_.Length - 1).ToString.Trim.Contains(pomocna_(pomocna_.Length - 1).ToString.Trim) = True Or pomocna_1.Length = pomocna_.Length Then

                    If pomocna_.Length = pomocna_1.Length - 1 Or pomocna_.Length - 1 = pomocna_1.Length - 1 Or pomocna_.Length - 2 = pomocna_1.Length - 2 Then

                        parametr = "<ul class=""sub-menu"">" + parametr
                    Else
                        parametr = "<ul class=""hideme"">" + parametr
                    End If
                ElseIf Path.ToString.Trim.Contains(Request.QueryString("menu").ToString.Trim) = True Then
                    parametr = "<ul class=""sub-menu"">" + parametr
                Else
                    parametr = "<ul class=""hideme"">" + parametr
                End If

            Else
                parametr = "<ul class=""hideme"">" + parametr
            End If
        Else
            parametr = "<ul class=""hideme"">" + parametr
        End If
        Return parametr
    End Function

    Function SQLVypisData_ul_li() As DataTable
        Dim string_ As String = IO.File.ReadAllText(System.Web.HttpContext.Current.Server.MapPath("~/files/sql.txt"))

        DataTable_Menu.Clear()

        If DataTable_Menu.Columns.Count <= 0 Then
            DataTable_Menu.Columns.Add("ID", GetType(Integer))          '0
            DataTable_Menu.Columns.Add("NAME", GetType(String))         '1
            DataTable_Menu.Columns.Add("HTMLNAME", GetType(String))     '2
            DataTable_Menu.Columns.Add("PATH", GetType(String))       '3
            DataTable_Menu.Columns.Add("css", GetType(String))          '4
            DataTable_Menu.Columns.Add("HtmlStart", GetType(String))    '5
            DataTable_Menu.Columns.Add("HtmlEnd", GetType(String))      '6
        End If

        Dim SQLConn As New Data.SqlClient.SqlConnection() 'The SQL Connection
        Dim SQLCmd As New Data.SqlClient.SqlCommand() 'The SQL Command
        Dim SQLdr As Data.SqlClient.SqlDataReader 'The Local Data Store
        Dim SQLStr As String
        Dim ConnString As String

        ConnString = System.Configuration.ConfigurationManager.ConnectionStrings("Conn").ConnectionString.ToString 'Admin_Local_Conn

        SQLStr = string_ 'FROM Menu_Admin"

        SQLConn.ConnectionString = ConnString 'Set the Connection String
        SQLConn.Open() 'Open the connection

        SQLCmd.Connection = SQLConn 'Sets the Connection to use with the SQL Command
        SQLCmd.CommandText = SQLStr 'Sets the SQL String
        SQLdr = SQLCmd.ExecuteReader 'Gets Data

        Dim pocetpolozek As Integer = 0
        Dim parametr As String
        Dim a() As String

        Dim HtmlStart As String = ""
        Dim HtmlEnd As String = ""

        While SQLdr.Read() 'While Data is Present
            parametr = "<li>T</li>"

            If SQLdr("id_submenu").ToString = "" And Not pocetpolozek <= 0 Then
                parametr = "</ul>" + parametr
            End If


            Dim ii As Integer = DataTable_Menu.Rows.Count - 1

            If Not SQLdr("id_submenu").ToString = "" Then
                Dim PocetStare() As String = DataTable_Menu.Rows(ii).Item(3).ToString.Trim.Split("/")
                Dim PocetNove() As String = SQLdr("path").ToString.Trim.Split("/")

                If PocetStare.Length < PocetNove.Length Then

                    Dim pom_1_a As String = DataTable_Menu.Rows(ii).Item(2).Replace("</li>", "")
                    Dim pom_1() As String = pom_1_a.Split("T")

                    DataTable_Menu.Rows(ii).Item(2) = pom_1_a

                    DataTable_Menu.Rows(ii).Item(5) = pom_1(0)
                    DataTable_Menu.Rows(ii).Item(6) = pom_1(1)

                    parametr = VlozCss(SQLdr("path").ToString.Trim, parametr) + parametr

                ElseIf (PocetStare.Length > PocetNove.Length) Then

                    Dim pom_2_a As String = DataTable_Menu.Rows(ii).Item(2) + "</ul>"
                    Dim pom_2() As String = pom_2_a.Split("T")

                    DataTable_Menu.Rows(ii).Item(2) = pom_2_a

                    DataTable_Menu.Rows(ii).Item(5) = pom_2(0)
                    DataTable_Menu.Rows(ii).Item(6) = pom_2(1)
                Else

                End If
            Else

                If Not pocetpolozek <= 0 Then
                    parametr = "<li></ul>" + parametr
                End If
            End If


            Dim pom() As String = parametr.Split("T")
            HtmlStart = pom(0)
            HtmlEnd = pom(1)

            DataTable_Menu.Rows.Add(Int(SQLdr("id").ToString.Trim), SQLdr("Nadpis"), parametr, SQLdr("path").ToString, SQLdr("css_div").ToString, HtmlStart, HtmlEnd)

            a = SQLdr("Path").ToString.Split("/")
            pocetpolozek = a.Length - 1
        End While

        SQLdr.Close() 'Close the SQLDataReader
        SQLConn.Close() 'Close the connection

        Return DataTable_Menu

    End Function

To mi sice vypise menu s UL a li ale ty css to je horsi dela si to co chce :D

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ne, ne takto jsem to opravdu nemyslel. A abych řekl pravdu tímto kódem se mi moc prokousávat nechce.

Říká vám něco single responsibility principle? Jedna metoda, která zároveň používá ADO.NET na té nejnižší úrovni (Connection, Command), načítá SQL dotaz z nějakého souboru, volá a zpracovává výsledky konkrétního databázového dotazu, mění nějaké DataTable_Menu, zpracovává parametry z query stringu, generuje kusy HTML a možná ještě něco, to jde hodně proti tomuto principu.

Doporučoval bych vám oddělit minimálně tyto tři části:

1) Držení stavu a objektová reprezentace menu (nejjednodušeji například globálně jako singleton).

2) Logika pro načtení a sestavení této objektové reprezentace z databáze.

3) Renderování HTML ze sestavené objektové reprezentace menu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

myslite neco takoveho ?

Tady je problem v tom ze zde nevim jak mam zakomponovat skryvani urcitych kategorii.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        doldur()
    End Sub

    Private Sub doldur()

        Dim da As New SqlDataAdapter("SELECT * FROM New_Menu_left", ConfigurationManager.ConnectionStrings("conn").ConnectionString)

        da.Fill(ds)

        Dim anaKategoriler As DataRow() = ds.Tables(0).[Select]("id_submenu = 0")

        For Each anaKategori As DataRow In anaKategoriler

            Dim li As New HtmlGenericControl("li")

            li.Controls.Add(New LiteralControl("<a href=""<%# Eval('ID') %> "">" & anaKategori("nadpis").ToString() & "</a>"))

            Menu1.Controls.Add(li)


            altmenu(Convert.ToInt32(anaKategori("ID")))
        Next
    End Sub

    Private Sub altmenu(ByVal kategoriId As Integer)

        Dim kategoriler As DataRow() = ds.Tables(0).[Select]("id_submenu=" & kategoriId)


        If kategoriler.Length = 0 Then
        Else

            Menu1.Controls.Add(New LiteralControl("<ul>"))

            For Each kategori As DataRow In kategoriler

                Dim li1 As New HtmlGenericControl("li")

                li1.Controls.Add(New LiteralControl("<a href='#'>" & kategori("nadpis").ToString() & "</a>"))

                Menu1.Controls.Add(li1)

                altmenu(Convert.ToInt32(kategori("ID")))
            Next

            Menu1.Controls.Add(New LiteralControl("</ul>"))
        End If
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Doporučuji nastudovat zde před několika lety uvedený článek - http://www.dotnetportal.cz/clanek/155/Pr.... Určitě Vám pomůže trochu pochopit, jak na to jít správně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji toto funguje, podařilo se mi vložit css ...

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        doldur()
    End Sub

    Private Sub doldur()
        Dim sql As String = IO.File.ReadAllText(Request.MapPath("~/files/sql.txt"))

        Dim da As New SqlDataAdapter(sql, ConfigurationManager.ConnectionStrings("conn").ConnectionString)         '"SELECT * FROM New_Menu_left", ConfigurationManager.ConnectionStrings("conn").ConnectionString)

        da.Fill(ds)

        Dim anaKategoriler As DataRow() = ds.Tables(0).[Select]("id_submenu = 0")

        For Each anaKategori As DataRow In anaKategoriler

            Dim li As New HtmlGenericControl("li")

            li.Controls.Add(New LiteralControl(vbCrLf + "<a href=""?menu=" + anaKategori("path").ToString() + """>" & anaKategori("nadpis").ToString() & "</a>" + vbCrLf))

            Menu1.Controls.Add(li)


            altmenu(Convert.ToInt32(anaKategori("ID")))
        Next
    End Sub

    Private Sub altmenu(ByVal kategoriId As Integer)

        Dim kategoriler As DataRow() = ds.Tables(0).[Select]("id_submenu=" & kategoriId)


        If kategoriler.Length = 0 Then
        Else


            Dim parametr As String = "<ul class=""*CSS*"">"
            If Request.QueryString.Count > 0 Then
                Dim pomocna_() As String = Request.QueryString("menu").ToString.Trim.Split("/")

                For i As Integer = 0 To pomocna_.Length - 1
                    If i >= 0 Then
                        If pomocna_(i).Contains(kategoriId.ToString) Then
                            parametr = parametr.Replace("*CSS*", "showme")
                        End If
                    End If
                Next
            End If

            parametr = parametr.Replace("*CSS*", "hideme")

            Menu1.Controls.Add(New LiteralControl(vbCrLf + parametr + vbCrLf))

            For Each kategori As DataRow In kategoriler

                Dim li1 As New HtmlGenericControl("li")

                li1.Controls.Add(New LiteralControl(vbCrLf + "<a href=""?menu=" + kategori("path").ToString() + """>" & kategori("nadpis").ToString() & "</a>" + vbCrLf))     '<a href='#'>" & kategori("nadpis").ToString() & "</a>"))

                Menu1.Controls.Add(li1)

                altmenu(Convert.ToInt32(kategori("ID")))
            Next

            Menu1.Controls.Add(New LiteralControl("</ul>" + vbCrLf))
        End If
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback