public virtual List<NavigationNode> FindMatches( NavigationNode[] allNodes, DeleteNavigationNodesDefinitionBase typedDefinition, Func<string, string> resolveTokenizedUrlAction) { var nodesToDelete = new List<NavigationNode>(); foreach (var nodeMatch in typedDefinition.NavigationNodes) { var foundByTitle = false; // search by Title, first if (!string.IsNullOrEmpty(nodeMatch.Title)) { var nodeByTitle = allNodes.FirstOrDefault(f => string.Equals(f.Title, nodeMatch.Title, StringComparison.OrdinalIgnoreCase)); if (nodeByTitle != null) { foundByTitle = true; if (!nodesToDelete.Contains(nodeByTitle)) { nodesToDelete.Add(nodeByTitle); } } } // give a try by Url, then if (!foundByTitle && !string.IsNullOrEmpty(nodeMatch.Url)) { var matchUrl = resolveTokenizedUrlAction(nodeMatch.Url); // special char resolution, manual fix to avoid // Add more tests for DeleteXXXnavigationNode scenarios #864 // https://github.com/SubPointSolutions/spmeta2/issues/864 matchUrl = HttpUtility.HtmlEncode(matchUrl); var nodeByUrl = allNodes.FirstOrDefault(f => !string.IsNullOrEmpty(f.Url) && f.Url.EndsWith(matchUrl, StringComparison.OrdinalIgnoreCase)); if (nodeByUrl != null) { if (!nodesToDelete.Contains(nodeByUrl)) nodesToDelete.Add(nodeByUrl); } } } return nodesToDelete; }
public virtual List<SPNavigationNode> FindMatches( SPNavigationNode[] allNodes, DeleteNavigationNodesDefinitionBase typedDefinition, Func<string, string> resolveTokenizedUrlAction) { var nodesToDelete = new List<SPNavigationNode>(); foreach (var nodeMatch in typedDefinition.NavigationNodes) { var foundByTitle = false; // search by Title, first if (!string.IsNullOrEmpty(nodeMatch.Title)) { var nodeByTitle = allNodes.FirstOrDefault(f => string.Equals(f.Title, nodeMatch.Title, StringComparison.OrdinalIgnoreCase)); if (nodeByTitle != null) { foundByTitle = true; if (!nodesToDelete.Contains(nodeByTitle)) { nodesToDelete.Add(nodeByTitle); } } } // give a try by Url, then if (!foundByTitle && !string.IsNullOrEmpty(nodeMatch.Url)) { var matchUrl = resolveTokenizedUrlAction(nodeMatch.Url); var nodeByUrl = allNodes.FirstOrDefault(f => !string.IsNullOrEmpty(f.Url) && f.Url.EndsWith(matchUrl, StringComparison.OrdinalIgnoreCase)); if (nodeByUrl != null) { if (!nodesToDelete.Contains(nodeByUrl)) nodesToDelete.Add(nodeByUrl); } } } return nodesToDelete; }
public virtual void DeleteNodesByMatch(DeleteNavigationNodesDefinitionBase typedDefinition, SPNavigationNodeCollection nodesCollection, Func<string, string> resolveTokenizedUrlAction) { var allNodes = nodesCollection.OfType<SPNavigationNode>() .ToArray(); var nodesToDelete = FindMatches(allNodes, typedDefinition, resolveTokenizedUrlAction); if (nodesToDelete.Any()) { foreach (var node in nodesToDelete.ToArray()) { node.Delete(); } } }
public virtual void DeleteNodesByMatch(DeleteNavigationNodesDefinitionBase typedDefinition, NavigationNodeCollection nodesCollection, Func<string, string> resolveTokenizedUrlAction) { var allNodes = nodesCollection.ToArray(); var nodesToDelete = FindMatches(allNodes, typedDefinition, resolveTokenizedUrlAction); if (nodesToDelete.Any()) { var context = nodesCollection.Context; foreach (var node in nodesToDelete.ToArray()) { node.DeleteObject(); } context.ExecuteQueryWithTrace(); } }