/// <summary> /// Acquires the robots meta values list from a given <see cref="T:System.Web.SiteMapNode"/> /// </summary> /// <param name="node">The node.</param> /// <param name="roles">The robots meta values IList to populate.</param> protected virtual void AcquireMetaRobotsValuesFrom(System.Web.SiteMapNode node, IList <string> metaRobotsValues) { var values = node.GetAttributeValue("metaRobotsValues").Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (var value in values) { metaRobotsValues.Add(value); } }
/// <summary> /// Acquires the preserved route parameters list from a given <see cref="T:System.Web.SiteMapNode"/> /// </summary> /// <param name="node">The node.</param> /// <param name="roles">The preserved route parameters IList to populate.</param> protected virtual void AcquirePreservedRouteParametersFrom(System.Web.SiteMapNode node, IList <string> preservedRouteParameters) { var localParameters = node.GetAttributeValue("preservedRouteParameters").Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (var parameter in localParameters) { preservedRouteParameters.Add(parameter.Trim()); } }
/// <summary> /// Inherits the controller from the parent node if it is not provided in the current <see cref="System.Web.SiteMapNode"/> and the parent node is not null. /// </summary> /// <param name="node">The siteMapNode element.</param> /// <param name="parentNode">The parent node.</param> /// <returns>The value provided by either the siteMapNode or parentNode.Controller.</returns> protected virtual string InheritControllerIfNotProvided(System.Web.SiteMapNode node, ISiteMapNode parentNode) { var result = node.GetAttributeValue("controller"); if (string.IsNullOrEmpty(result) && parentNode != null) { result = parentNode.Controller; } return(result); }
/// <summary> /// Inherits the area from the parent node if it is not provided in the current <see cref="System.Web.SiteMapNode"/> and the parent node is not null. /// </summary> /// <param name="node">The siteMapNode element.</param> /// <param name="parentNode">The parent node.</param> /// <returns>The value provided by either the siteMapNode or parentNode.Area.</returns> protected virtual string InheritAreaIfNotProvided(System.Web.SiteMapNode node, ISiteMapNode parentNode) { var result = node.GetAttributeValue("area"); // NOTE: Since there is no way to determine if an attribute exists without using reflection, // using area="" to override the parent area is not supported. if (string.IsNullOrEmpty(result) && parentNode != null) { result = parentNode.Area; } return(result); }
protected virtual ISiteMapNodeToParentRelation GetSiteMapNodeFromProviderNode(System.Web.SiteMapNode node, ISiteMapNode parentNode, ISiteMapNodeHelper helper) { // Use the same keys as the underlying provider. string key = node.Key; var implicitResourceKey = node.ResourceKey; // Create Node var nodeParentMap = helper.CreateNode(key, parentNode.Key, SourceName, implicitResourceKey); var siteMapNode = nodeParentMap.Node; siteMapNode.Title = node.Title; siteMapNode.Description = node.Description; if (this.reflectAttributes) { // Unfortunately, the ASP.NET implementation uses a protected member variable to store // the attributes, so there is no way to loop through them without reflection or some // fancy dynamic subclass implementation. var attributeDictionary = node.GetPrivateFieldValue <NameValueCollection>("_attributes"); siteMapNode.Attributes.AddRange(attributeDictionary, false); } siteMapNode.Roles.AddRange(node.Roles); siteMapNode.Clickable = bool.Parse(node.GetAttributeValueOrFallback("clickable", "true")); siteMapNode.VisibilityProvider = node.GetAttributeValue("visibilityProvider"); siteMapNode.DynamicNodeProvider = node.GetAttributeValue("dynamicNodeProvider"); siteMapNode.ImageUrl = node.GetAttributeValue("imageUrl"); siteMapNode.ImageUrlProtocol = node.GetAttributeValue("imageUrlProtocol"); siteMapNode.ImageUrlHostName = node.GetAttributeValue("imageUrlHostName"); siteMapNode.TargetFrame = node.GetAttributeValue("targetFrame"); siteMapNode.HttpMethod = node.GetAttributeValueOrFallback("httpMethod", "*").ToUpperInvariant(); siteMapNode.Url = node.Url; siteMapNode.CacheResolvedUrl = bool.Parse(node.GetAttributeValueOrFallback("cacheResolvedUrl", "true")); siteMapNode.IncludeAmbientValuesInUrl = bool.Parse(node.GetAttributeValueOrFallback("includeAmbientValuesInUrl", "false")); siteMapNode.Protocol = node.GetAttributeValue("protocol"); siteMapNode.HostName = node.GetAttributeValue("hostName"); siteMapNode.CanonicalKey = node.GetAttributeValue("canonicalKey"); siteMapNode.CanonicalUrl = node.GetAttributeValue("canonicalUrl"); siteMapNode.CanonicalUrlProtocol = node.GetAttributeValue("canonicalUrlProtocol"); siteMapNode.CanonicalUrlHostName = node.GetAttributeValue("canonicalUrlHostName"); siteMapNode.MetaRobotsValues.AddRange(node.GetAttributeValue("metaRobotsValues"), new[] { ' ' }); siteMapNode.ChangeFrequency = (ChangeFrequency)Enum.Parse(typeof(ChangeFrequency), node.GetAttributeValueOrFallback("changeFrequency", "Undefined")); siteMapNode.UpdatePriority = (UpdatePriority)Enum.Parse(typeof(UpdatePriority), node.GetAttributeValueOrFallback("updatePriority", "Undefined")); siteMapNode.LastModifiedDate = DateTime.Parse(node.GetAttributeValueOrFallback("lastModifiedDate", DateTime.MinValue.ToString())); siteMapNode.Order = int.Parse(node.GetAttributeValueOrFallback("order", "0")); // Handle route details // Assign to node siteMapNode.Route = node.GetAttributeValue("route"); if (this.reflectRouteValues) { // Unfortunately, the ASP.NET implementation uses a protected member variable to store // the attributes, so there is no way to loop through them without reflection or some // fancy dynamic subclass implementation. var attributeDictionary = node.GetPrivateFieldValue <NameValueCollection>("_attributes"); siteMapNode.RouteValues.AddRange(attributeDictionary); } siteMapNode.PreservedRouteParameters.AddRange(node.GetAttributeValue("preservedRouteParameters"), new[] { ',', ';' }); siteMapNode.UrlResolver = node.GetAttributeValue("urlResolver"); // Add inherited route values to sitemap node foreach (var inheritedRouteParameter in node.GetAttributeValue("inheritedRouteParameters").Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries)) { var item = inheritedRouteParameter.Trim(); if (parentNode.RouteValues.ContainsKey(item)) { siteMapNode.RouteValues.Add(item, parentNode.RouteValues[item]); } } // Handle MVC details // Get area and controller from node declaration siteMapNode.Area = this.InheritAreaIfNotProvided(node, parentNode); siteMapNode.Controller = this.InheritControllerIfNotProvided(node, parentNode); return(nodeParentMap); }
protected virtual ISiteMapNode GetSiteMapNodeFromProviderNode(ISiteMap siteMap, System.Web.SiteMapNode node, ISiteMapNode parentNode) { // Use the same keys as the underlying provider. string key = node.Key; var implicitResourceKey = node.ResourceKey; // Create Node ISiteMapNode siteMapNode = siteMapNodeFactory.Create(siteMap, key, implicitResourceKey); siteMapNode.Title = node.Title; siteMapNode.Description = String.IsNullOrEmpty(node.Description) ? siteMapNode.Title : node.Description; if (this.reflectAttributes) { AcquireAttributesFrom(node, siteMapNode.Attributes); } AcquireRolesFrom(node, siteMapNode.Roles); siteMapNode.Clickable = bool.Parse(node.GetAttributeValueOrFallback("clickable", "true")); siteMapNode.VisibilityProvider = node.GetAttributeValue("visibilityProvider"); siteMapNode.DynamicNodeProvider = node.GetAttributeValue("dynamicNodeProvider"); siteMapNode.ImageUrl = node.GetAttributeValue("imageUrl"); siteMapNode.TargetFrame = node.GetAttributeValue("targetFrame"); siteMapNode.HttpMethod = node.GetAttributeValueOrFallback("httpMethod", "*").ToUpperInvariant(); siteMapNode.Url = node.Url; siteMapNode.CacheResolvedUrl = bool.Parse(node.GetAttributeValueOrFallback("cacheResolvedUrl", "true")); siteMapNode.CanonicalUrl = node.GetAttributeValue("canonicalUrl"); siteMapNode.CanonicalKey = node.GetAttributeValue("canonicalKey"); this.AcquireMetaRobotsValuesFrom(node, siteMapNode.MetaRobotsValues); siteMapNode.ChangeFrequency = (ChangeFrequency)Enum.Parse(typeof(ChangeFrequency), node.GetAttributeValueOrFallback("changeFrequency", "Undefined")); siteMapNode.UpdatePriority = (UpdatePriority)Enum.Parse(typeof(UpdatePriority), node.GetAttributeValueOrFallback("updatePriority", "Undefined")); siteMapNode.LastModifiedDate = DateTime.Parse(node.GetAttributeValueOrFallback("lastModifiedDate", DateTime.MinValue.ToString())); // Handle route details // Assign to node siteMapNode.Route = node.GetAttributeValue("route"); if (this.reflectRouteValues) { AcquireRouteValuesFrom(node, siteMapNode.RouteValues); } AcquirePreservedRouteParametersFrom(node, siteMapNode.PreservedRouteParameters); siteMapNode.UrlResolver = node.GetAttributeValue("urlResolver"); // Add inherited route values to sitemap node foreach (var inheritedRouteParameter in node.GetAttributeValue("inheritedRouteParameters").Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries)) { var item = inheritedRouteParameter.Trim(); if (parentNode.RouteValues.ContainsKey(item)) { siteMapNode.RouteValues.Add(item, parentNode.RouteValues[item]); } } // Handle MVC details // Get area, controller and action from node declaration string area = node.GetAttributeValue("area"); string controller = node.GetAttributeValue("controller"); siteMapNode.Area = area; siteMapNode.Controller = controller; // Inherit area and controller from parent if (parentNode != null) { if (string.IsNullOrEmpty(area)) { siteMapNode.Area = parentNode.Area; } if (string.IsNullOrEmpty(controller)) { siteMapNode.Controller = parentNode.Controller; } } // Add defaults for area if (!siteMapNode.RouteValues.ContainsKey("area")) { siteMapNode.RouteValues.Add("area", ""); } return(siteMapNode); }