Antonio Feliziani
a- a+

Creazione di una mappa del sito attraverso la funzione Site Navigation

Nel precedente articolo abbiamo visto in dettaglio come funziona il sistema di Site Navigation offerto da ASP.NET 2.0; ora vediamo come estendere questo sistema implementando un Site Map Provider personalizzato, che legga le voci da inserire nella struttura di navigazione da una base di dati.

Per far ciò bisogna creare una classe che erediti dalla classe System.Web.StaticSiteMapProvider e che faccia l'overload di questi due metodi:

  • BuildSiteMap - Carica le informazioni per la Site Map dallo storage scelto, che può essere un file di testo, un database o anche il file system.
  • GetRootNodeCore - Ritorna il nodo principale che gestisce tutti i sotto nodi presenti nel provider corrente. Questo metodo viene chiamato più volte da più classi del sistema di Site Navigation, per assicurarsi che la struttura presente nel provider venga caricata correttamente.

Ecco, quelli appena descritti erano i metodi che bisogna sovrascrivere per forza, ma sarebbe meglio sovrascrivere anche questi altri metodi:

  • Inizialize - Inizializza le strutture dati da cui vengono prese le informazioni per la creazione della struttura del provider.
  • Clear - Pulisce la struttura da qualsiasi nodo presente.
  • FindSiteMapNode - Cerca un nodo all'interno della struttura presente nel provider.

Descritti i metodi principali da sovrascrivere, vediamo in dettaglio il codice per implementare un provider che legga le informazioni da un base di dati e crei la struttura di navigazione.

Per semplicità ho creato un db Access con un'unica tabella, definita in questo modo:

Samples(ID, Title, Content)

e ho lasciato cablata nel codice, la query di selezione dei dati (cosa che non andrebbe fatta).

CustomSiteMapProvider.cs

    using System;

using System.Data;

using System.Data.OleDb;

using System.Configuration;

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;

using System.Security.Permissions;

using System.Runtime.CompilerServices;



/// /// Custom SiteMapProvider/// [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)]

public class CustomSiteMapProvider : StaticSiteMapProvider

{

    #region Fields    private OleDbConnection conn = null;

    private SiteMapNode rootNode = null;

    #endregion    #region Constructor    public CustomSiteMapProvider(){ }

    #endregion    #region Overrides        #region Initialize        public override void Initialize(string name,

                    System.Collections.Specialized.NameValueCollection attributes)

        {

            base.Initialize(name, attributes);

            string strConn = ConfigurationManager.ConnectionStrings["strConn"].ConnectionString;

            if (String.IsNullOrEmpty(strConn))

                throw new ConfigurationErrorsException("Db connection string not found");

        }

        #endregion        #region BuildSiteMap        [MethodImpl(MethodImplOptions.Synchronized)]

        public override SiteMapNode BuildSiteMap()

        {

            //Pulisco tutti i nodi della collezione (se ce ne sono)            Clear();

            //Esco dal metodo se il nodo root non è nullo            if (this.rootNode != null) return this.rootNode;



            //Creo il root node            this.rootNode = new SiteMapNode(this, "0" , "~/samples.aspx" , "Samples" , "Samples");

            AddNode(this.rootNode, null);



            //Creo i suoi nodi figli            string query = "SELECT * FROM Samples ORDER BY ID ASC";

            try

            {

                string strConn =

                        ConfigurationManager.ConnectionStrings["strConn"].ConnectionString;

                using (conn = new OleDbConnection(strConn))

                {

                    OleDbCommand cmd = new OleDbCommand();

                    cmd.CommandType = CommandType.Text;

                    cmd.CommandText = query;

                    cmd.Connection = conn;

                    conn.Open();

                    OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

                    if (reader.HasRows)

                    {

                        while (reader.Read())

                        {

                            SiteMapNode childNode = new SiteMapNode(this,

                                        reader["ID"].ToString(),

                                        this.rootNode.Url + "?id=" + reader["ID"].ToString(),

                                        reader["Title"].ToString(),

                                        reader["Title"].ToString());

                            //Adds child node to root node                            AddNode(childNode, this.rootNode);

                        }

                        reader.Close();

                        reader.Dispose();

                    }

                    else

                        return null;

                }

            }

            catch (Exception exe)

            {

                throw new Exception(exe.Message, exe);

            }

            //return root node            return this.rootNode;

        }

        #endregion        #region GetRootNodeCore        protected override SiteMapNode GetRootNodeCore()

        {

            BuildSiteMap();

            return this.rootNode;

        }

        #endregion        #region Clear        protected override void Clear()

        {

            this.rootNode = null;

            base.Clear();

        }

        #endregion    #endregion}



Per essere utilizzato non dobbiamo far altro che aggiungerlo all'elenco dei provider presente nel web.config
 

    <siteMap defaultProvider="All_SiteMapProvider">

   <providers>

      <clear />

      <add name="All_SiteMapProvider" siteMapFile="Web.sitemap" 

           type="System.Web.XmlSiteMapProvider" />

      <add name="External_SiteMapProvider" siteMapFile="~/Articoli/articoli.sitemap"

           type="System.Web.XmlSiteMapProvider" />

      <add name="CustomSiteMapProvider" type="CustomSiteMapProvider" />

   providers>

siteMap>



e al provider di default, che nel nostro caso è sempre il file web.sitemap:
 

    xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

    <siteMapNode url="~/Default.aspx" title="Home"  description="Home page">

        <siteMapNode url="~/blog.aspx" title="Blog"  description="My Blog" />

        <siteMapNode provider="External_SiteMapProvider" />

        <siteMapNode provider="CustomSiteMapProvider" />

    siteMapNode>

siteMap>



Abbiamo quindi visto in dettaglio, come creare un Site Map Provider personalizzato da aggiungere ai provider di default per la creazione della struttura di navigazione della nostra applicazione web; capirete che tramite questa tecnica ci vengono offerti infiniti metodi di personalizzazione del sistema di navigazione presente in ASP.NET 2.



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Staff
Ti interessano altri articoli su questo argomento?
Chiedi alla nostra Redazione!