Alternativa al web.sitemap per le molliche di pane

mercoledì 23 maggio 2012 - 14.19
Tag Elenco Tags  VB.NET  |  .NET 3.5

zseven Profilo | Senior Member

Ciao ragazzi,
siccome sto avendo moltissimi problemi con la creazione di un web.sitemap dinamico, o meglio con il suo utilizzo in quanto spessissimo risulta bloccato e non più modificabile, volevo chiedervi se avete delle soluzioni alternative a questo per la creazione delle cosiddette molliche di pane.

Grazie mille
Guido

Gluck74 Profilo | Guru

l'errore che hai non dovrebbe accadere, e non dovrebbe nemmeno giustificare l'abbandono del web.sitemap.

Piuttosto cerca di capire come mai rimane bloccato.
Controlla il tuo codice, verifica dove come e quando viene aperto e se rimane aperto da qualche parte.

L'alternativa è spostare su DB utilizzando un provider per sqlserver piuttosto che per xml
Su internet lo trovi già pronto

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Ciao Gluck,
purtroppo è ormai tantissimo tempo che cerco una soluzione, ma se risultati. Un post vecchio proprio con te è rimasto tuttora irrisolto
http://www.dotnethell.it/forum/messages.aspx?ThreadID=40652

Quando mi parli di prelevare da db senza usare il file xml a cosa ti riferisci?

La mia web.sitemap racchiude tra i vari nodi i risultati che sono presenti in differenti tabelle del database, come posso fare a collegare i risultati del sitemap alla struttura del mio database?

Grazie mille
Guido

Gluck74 Profilo | Guru

quello che intendo io, è di avere i dati del sitemap non salvati su xml, ma su DB.
Ovvero avere una tabella al posto del file, ed utilizzare un provider per sitemap che prenda i dati da questa tabella.

Su internet trovi dei provider già pronti per sql, e le specifiche di come deve essere la tabella.
Vedi anche questi link:
http://www.mrwebmaster.it/aspnet/articoli/creazione-custom-site-map-provider_639.html
http://www.codeproject.com/Articles/96461/Building-a-Custom-Site-Map-Provider
http://www.asp.net/web-forms/tutorials/data-access/database-driven-site-maps/building-a-custom-database-driven-site-map-provider-cs
http://msdn.microsoft.com/it-it/magazine/cc163657(en-us).aspx
http://msdn.microsoft.com/it-it/magazine/cc163787(en-us).aspx
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Ciao Gluck,
scusami sto cercando di capire meglio questi concetti per applicarli al mio problema, ma ho un pò di difficoltà, anzi molte difficoltà.

Se ho capito bene in pratica io posso, all'interno del mio web.sitemap, inserire un CustoSitemapProvider che richiama automaticamente i valori recuperati dal database, senza richiamare il file sitemap come faccio ora che mi genera un pò di errori.
Partendo da questo presupposto io ho un file web.sitemap di questo tipo:

<?xml version="1.0" encoding="utf-8"?> <siteMap> <siteMapNode url="/default.aspx" title="Home" description="Home"> <siteMapNode url="/categorie.aspx" title="Categorie" description="Categorie"> <siteMapNode provider="CustomSiteMapProvider" /> </siteMapNode> </siteMapNode> </siteMap>

Le mie categorie sono inserite all'interno di un'unica tabella con ID, parent, e nome come colonne, e attraverso un codice riesco a mostrare le categorie in maniera ricorsiva nell'oggetto asp:menu.

Adesso stavo provando a vedere questo esempio tra quelli che mi hai dato (e ne ho visti davvero altri diecimila, ma davvero non ci arrivo...)
http://www.aspcode.it/articoli/133_Creazione-di-un-custom-Site-Map-Provider.htm

Nel web.config ho inserito questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Quindi ho creato una classe chiamandola CustomSitemapProvider.vb (ho convertito il codice in C# in VB per me un minimo più chiaro) e posizionata nella cartella App_Code.

Ma adesso sono completamente bloccato...
Come uso tutto questo?
Cosa faccio a mostrare nell'oggetto sitemappath tutte le molliche di pane corrette?

Spero tu possa aiutarmi.
Grazie mille

Gluck74 Profilo | Guru

ciao, ci sei quasi.
come esempi comunque ti suggerisco questi che sono molto completi (anche come costruzione della tabella):
http://msdn.microsoft.com/it-it/magazine/cc163657(en-us).aspx
http://msdn.microsoft.com/it-it/magazine/cc163787(en-us).aspx


per il controllo websitepath, in teoria devi solo aggiungerlo alla pagina web

____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Purtroppo con il codice che mi hai indicato non arriverò mai ad una soluzione.
E' per me incomprensibile, ed inoltre incompleto in quanto omette una serie di funzioni che non saprei proprio come generare, ecco perchè volevo capire meglio cosa e in che maniera farlo magari con un codice per me più abbordabile, e che si potesse modificare più agevolmente.

Partendo da quel codice che ti ho indicato riesci a darmi qualche indicazione più specifica per risolvere il problema?
Cosa dovrei modificare su quel codice per ottenere il risultato di cui ho bisogno spiegato sotto?

Il Sitemappath è collegato sulle pagine così:
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
<asp:SiteMapPath runat="server" ID="SiteMapPath1" PathSeparator=" &raquo; "></asp:SiteMapPath>

Se sto sulla home o sulla pagina categorie.aspx che è scritta direttamente sul web.sitemap funziona ovviamente e visualizzo le molliche di pane.
Se invece clicco su una categoria dal menu del sito e arrivo sulla pagina del tipo
/categorie/quaderni-8.aspx
non viene visualizzato più nulla.

Posso in qualche modo vedere il sitemapprovider cosa mi genera e cosa mi restituisce?
Ho provato facendo un write della funzione, ma mi restituisce solo in homepage il valore assegno al root node, cioè' sample. Nelle altre pagine non ottengo nulla.

Grazie mille

Gluck74 Profilo | Guru

be, da quello che mi dici, non sembrerebbero esserci errori.
Bisogna vedere cosa restituisce il tuo CustomSiteMapProvider, se costruisce bene tutto il resto del sito.

hai provato ad utilizzare lo stesso provider per un semplice menù? lo costruisce bene? con i valori giusti?

Ad esempio, nel menù, esiste la pagina "/categorie/quaderni-8.aspx"?
quindi, esiste un nodo con url "/categorie/quaderni-8.aspx"?


____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Io il menu lo carico in altro modo, cioè recuperando direttamente le informazioni dal database senza l'utilizzo di file xml o altro, usando il codice che ti elenco sotto.
Ma se clicco appunto su una di queste voci che mi porta all'indirizzo che ti ho indicato il sitemappath non mostra più nulla.

Ho provato ad associare l'sqlsitemapsource al menu e come risultato ottengo questo:
Home -> Categorie -> Home -> Elenco di tutte le categorie e sottocategorie

Che lo capisco anche, in quanto io nel provider gli ho detto
"SELECT * FROM tab_categorie"
e me le ha ciclate tutte senza pensare ai parent e ai child da associare come ho fatto nel codice che vedi sotto peril menu.

Posso secondo te utilizzare questo stesso codice che funziona per il menu per il provider?
Lì uso datatable e dataview e aggiungo item al menu.
Come soluzione sarebbe possibile?

Grazie mille


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Gluck74 Profilo | Guru

be, in pratica fai a mano quello che dovrebbe fare in automatico il sitemapprovider.

potrebbe andare bene ugualmente, ma fai del lavoro in più che potresti risparmiarti.

Da quello che mi dici e mi fai vedere, deduco che c'è un errore nel nuovo provider. è per questo che il sitemappath non lo vedi corretto.

se ti torna più facile, agisci come hai hatto per il menu

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Allora adesso sto provando così ma mi va la pagina in loop, come se la funzione ricorsiva fosse sbagliata.
In pratica non ho fatto altro che usare la stessa che uso per il menu.

Puoi vedere se riesci a trovarci un errore? Sto veramente alle ultime speranze...

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

zseven Profilo | Senior Member

CE L'HO FATTA!!!!!!!!

Non ci speravo più!!!
Grazie mille per gli aiuti, i suggerimenti e le spiegazioni!!

Alla fine ho utilizzato il codice di sopra con il dataview per popolare i vari oggetti.

Grazie grazie grazie!!

zseven Profilo | Senior Member

Ciao Gluck,
scusa se riprendo questa discussione, ma nel fare un pò di prove sto constatando che questo sistema mi fa rallentare tantissimo l'apertura delle pagine.
In pratica lui ad ogni pagina va a creare una web.sitemap aggiornata se ho capito bene, e nel momento in cui i prodotti sono tanti e ramificati nelle categorie diventa un tempo lunghissimo.

Ti riscrivo il codice completo, in pratica io dopo aver creato il sistema per le categorie ho dovuto gestire al suo interno anche lo stesso sistema per i prodotti, e questo mi porta un rallentamento enorme.
Come vedrai dal codice ho dovuto fare la sub ricorsiva oltre che per le categorie anche per i prodotti che si troveranno al suo interno.
Pensi che ho sbagliato qualcosa?

Grazie mille

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Gluck74 Profilo | Guru

e be si,
per ogni nodo da aggiungere tu fai questa istruzione:
SELECT *FROM tab_prodotti
per poi filtrare per categoria.

è questo che ti fa rallentare il tutto.
Se hai 20 categorie e ognuna ha 2 sottocategorie, carichi tutti i prodotti 40 volte!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Piuttosto caricali solo una volta e mettili in cache, in session, in una tabella a livello di pagina, dove vuoi ma non chiamarla 40 volte!!!!!!
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Eh ma infatti ho capito il problema, e in questi giorni ho lavorato per una soluzione differente che non comprende la web.sitemap.

In pratica l'ho simulata facendo una query ricorsiva per sapere il percorso a ritroso delle categorie partendo da quella selezionata, ed ho mostrato i risultati in un semplice repetaer.
In questa maniera ho velocizzato il tutto perchè la sitemap l'ho abolita, e su ogni pagina non faccio altro che caricare massimo i 3-4 valori delle categorie e del prodotti con una semplice SELECT.

Tirando le somme la web.sitemap, e le soluzioni con i provider non è che mi abbiano impressionato positivamente.
Eccesivamente complicate come soluzioni, soprattutto quando poi con questa query utilizzata riesco a fare la stessa operazione con il minimo sforzo, mio e del sito.

Non so se condividi le mie conclusioni.

Grazie mille per tutto ugualmente.
Guido

Gluck74 Profilo | Guru

probabilmente hai sbagliato qualcosa.
Quello che hai fatto tu, è praticamente la stessa cosa che farebbe un provider custom per sitemap.

Solo che quello che hai fatto tu è completamente custom, mentre creando un provider, devi seguire certe regole e certe interfacce che ti pemettono di utilizzare quel provider con tutti i controlli standard di asp.net per la navigazione.


____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

zseven Profilo | Senior Member

Sicuramente, però ragionavo sul fatto che per realizzare un provider bisogna scrivere una marea di righe di codice anche abbastanza complesse, mentre invece la soluzione che ho realizzato è semplicissima, con una query di 3 righe (che fornisce tra l'altro lo stesso sito microsoft per risolvere questo tipo di problemi) ed un datarepeater elementare.

Ecco i motivi dei miei dubbi...

Gluck74 Profilo | Guru

i tuoi dubbi sono leciti.
certamente una soluzione custom che ti fa risparmiare tempo va benissimo.

Mentre una soluzione complessa come un provider, che richiede una discreta conoscenza sia di ASP.NET sia del framework, ti permette di scrivere codice riutilizzabile.
Infatti un provider una volta fatto, è fatto.
Lo puoi riutilizzare come e quando vuoi, e lo puoi agganciare ad occhi chiusi ad un menu, treeview, bricioline, o qualsiasi altro controllo adatto a visualizzare dati gerarchici.

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5