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.
- Articolo precedente Site Navigation, nuova funzione di Asp Net 2.0
- Articolo successivo Interazioni e applicazioni Asp Net 2.0 con Excel e Word
Ti potrebbe interessare anche
commenta la notizia
Chiedi alla nostra Redazione!