using System; using System.Data; 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.Web.Caching; publicclass NorthwindSiteMapProvider : StaticSiteMapProvider { privatereadonlyobject siteMapLock =newobject(); private SiteMapNode root =null; publicconststring CacheDependencyKey ="NorthwindSiteMapProviderCacheDependency"; publicoverride SiteMapNode BuildSiteMap() { // Use a lock to make this method thread-safe lock (siteMapLock) { // First, see if we already have constructed the // rootNode. If so, return it if (root !=null) return root; // We need to build the site map! // Clear out the current site map structure base.Clear(); // Get the categories and products information from the database ProductsBLL productsAPI =new ProductsBLL(); Northwind.ProductsDataTable products = productsAPI.GetProducts(); // Create the root SiteMapNode root =new SiteMapNode(this, "root", "~/SiteMapProvider/Default.aspx", "All Categories"); AddNode(root); // Create SiteMapNodes for the categories and products foreach (Northwind.ProductsRow product in products) { // Add a new category SiteMapNode, if needed string categoryKey, categoryName; bool createUrlForCategoryNode =true; if (product.IsCategoryIDNull()) { categoryKey ="Category:None"; categoryName ="None"; createUrlForCategoryNode =false; } else { categoryKey =string.Concat("Category:", product.CategoryID); categoryName = product.CategoryName; } SiteMapNode categoryNode = FindSiteMapNodeFromKey(categoryKey); // Add the category SiteMapNode if it does not exist if (categoryNode ==null) { string productsByCategoryUrl =string.Empty; if (createUrlForCategoryNode) productsByCategoryUrl ="~/SiteMapProvider/ProductsByCategory.aspx?CategoryID="+ product.CategoryID; categoryNode =new SiteMapNode(this, categoryKey, productsByCategoryUrl, categoryName); AddNode(categoryNode, root); } // Add the product SiteMapNode string productUrl ="~/SiteMapProvider/ProductDetails.aspx?ProductID="+ product.ProductID; SiteMapNode productNode =new SiteMapNode(this, string.Concat("Product:", product.ProductID), productUrl, product.ProductName); AddNode(productNode, categoryNode); } // Add a "dummy" item to the cache using a SqlCacheDependency // on the Products and Categories tables System.Web.Caching.SqlCacheDependency productsTableDependency =new System.Web.Caching.SqlCacheDependency("NorthwindDB", "Products"); System.Web.Caching.SqlCacheDependency categoriesTableDependency =new System.Web.Caching.SqlCacheDependency("NorthwindDB", "Categories"); // Create an AggregateCacheDependency System.Web.Caching.AggregateCacheDependency aggregateDependencies =new System.Web.Caching.AggregateCacheDependency(); aggregateDependencies.Add(productsTableDependency, categoriesTableDependency); // Add the item to the cache specifying a callback function HttpRuntime.Cache.Insert(CacheDependencyKey, DateTime.Now, aggregateDependencies, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, new CacheItemRemovedCallback(OnSiteMapChanged)); // Finally, return the root node return root; } } protectedoverride SiteMapNode GetRootNodeCore() { return BuildSiteMap(); } protectedvoid OnSiteMapChanged(string key, object value, CacheItemRemovedReason reason) { lock (siteMapLock) { if (string.Compare(key, CacheDependencyKey) ==0) { // Refresh the site map root =null; } } } public DateTime? CachedDate { get { return HttpRuntime.Cache[CacheDependencyKey] as DateTime?; } } }
posted on
2007-07-10 15:18earlier
阅读(429)
评论(0)
编辑收藏举报