Dobrý večer. S pomocí ukázkového kódu jsem si napsal SqlSiteMapProvider pro hierarchické ukládání kategorií produktů. Všechno funguje fajn, až do té doby, než se pokusím do tohoto providera vložit další vnořenou hierarchii dat. V tom okamžiku dostanu chybovou hlášku "Exception Details: System.Configuration.ConfigurationErrorsException: Child nodes are not allowed." Hledal jsem na internetu, ale nic jsem nenašel. Mohl by mi někdo poradit co je potřeba ještě udělat, aby se můj Provider uměl chovat tak, že se do něj dají vkládat další hierarchické struktury ?? Předem moc děkuji
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="~/" title="Root" description="">
<siteMapNode provider="ShopMenu">
<siteMapNode url="~/Pokus.aspx" title="Pokus" description=""/>
</siteMapNode>
<siteMapNode url="" title="" description="" />
<siteMapNode url="" title="" description="" />
</siteMapNode>
</siteMap>
public class SqlSiteMapProvider : StaticSiteMapProvider
{
#region "Properties and configuration"
private string _title;
/// <summary>
/// Název kořenové položky
/// </summary>
public string Title
{
get { return _title; }
set { _title = value; }
}
private string _url;
/// <summary>
/// URL kořenové položky
/// </summary>
public string Url
{
get { return _url; }
set { _url = value; }
}
private string _connectionStringName;
/// <summary>
/// Název connectionStringu, který použijeme k připojení do databáze
/// </summary>
public string ConnectionStringName
{
get { return _connectionStringName; }
set { _connectionStringName = value; }
}
private string _selectCommand;
/// <summary>
/// SQL příkaz, který vybere seznam položek
/// </summary>
public string SelectCommand
{
get { return _selectCommand; }
set { _selectCommand = value; }
}
private string _titleColumn;
/// <summary>
/// Název sloupce s názvy stránek
/// </summary>
public string TitleColumn
{
get { return _titleColumn; }
set { _titleColumn = value; }
}
private string _urlColumn;
/// <summary>
/// Název sloupce s hodnotami, které se budou dosazovat do URL
/// </summary>
public string UrlColumn
{
get { return _urlColumn; }
set { _urlColumn = value; }
}
private string _urlFormatString;
/// <summary>
/// URL adresa, do které se budou dosazovat hodnoty z datbaáze
/// </summary>
public string UrlFormatString
{
get { return _urlFormatString; }
set { _urlFormatString = value; }
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection attributes)
{
base.Initialize(name, attributes);
//načíst hodnoty parametrů z konfigurace
if (attributes["title"] != null)
{
this.Title = attributes["title"];
}
else throw new ArgumentException("title");
if (attributes["url"] != null)
{
this.Url = attributes["url"];
}
else throw new ArgumentException("url");
if (attributes["connectionStringName"] != null)
{
this.ConnectionStringName = attributes["connectionStringName"];
}
else throw new ArgumentException("connectionStringName");
if (attributes["selectCommand"] != null)
{
this.SelectCommand = attributes["selectCommand"];
}
else throw new ArgumentException("selectCommand");
if (attributes["titleColumn"] != null)
{
this.TitleColumn = attributes["titleColumn"];
}
else throw new ArgumentException("titleColumn");
if (attributes["urlColumn"] != null)
{
this.UrlColumn = attributes["urlColumn"];
}
else throw new ArgumentException("urlColumn");
if (attributes["urlFormatString"] != null)
{
this.UrlFormatString = attributes["urlFormatString"];
}
else throw new ArgumentException("urlFormatString");
}
#endregion
private SiteMapNode root;
public override SiteMapNode BuildSiteMap()
{
SiteMapNode rootNode;
lock (this)
{
if (root == null) //pokud je třeba generovat, generujeme
{
//vytvořit kořenovou položku
root = new SiteMapNode(this, Guid.NewGuid().ToString(), this.Url, this.Title);
//podpoložky natáhnout z databáze
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings[this.ConnectionStringName].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(SelectCommand, con);
DataSet ds = new DataSet();
da.Fill(ds, "SiteMap");
DataTable dtSiteMap = ds.Tables["SiteMap"];
DataRow rowRoot = dtSiteMap.Select("ParentID IS NULL")[0];
//projít vrácené záznamy
rootNode = new SiteMapNode(this, Guid.NewGuid().ToString(), string.Format(this.UrlFormatString, rowRoot[this.UrlColumn]), rowRoot[this.TitleColumn].ToString());
//string rootID = rowRoot["ID"].ToString();
string rootID = "1";
AddNode(rootNode, root);
AddChildren(rootNode, rootID, dtSiteMap);
}
return root; //vrátíme kořenovou položku
}
}
private void AddChildren(SiteMapNode rootNode, string rootID, DataTable dtSiteMap)
{
DataRow[] childRows = dtSiteMap.Select("ParentID = " + rootID);
foreach (DataRow row in childRows)
{
SiteMapNode childNode = new SiteMapNode(this, Guid.NewGuid().ToString(), string.Format(this.UrlFormatString, row[this.UrlColumn]), row[this.TitleColumn].ToString());
string rowID = row["ID"].ToString();
// Přidá SiteMapNode do kolekce ChildNodes
// Metodou SiteMapNode AddNode
AddNode(childNode, rootNode);
// Kontroluje dceřiné uzly tohoto uzlu
AddChildren(childNode, rowID, dtSiteMap);
}
}
protected override System.Web.SiteMapNode GetRootNodeCore()
{
return BuildSiteMap();
}
}
|