asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 9239
ASPCode.it - Store

  > > Articoli

Creazione di un custom Site Map Provider

Data di pubblicazione: 07/06/2006        Voto della community: 4,33 (Votanti: 2)

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;

/// <summary>
/// Custom SiteMapProvider
/// </summary>
[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.

Si ringrazia PeppeDotNet.it per la gentile concessione dell'articolo.




Utenti connessi: 9239