// add parameters to the macro parameters collection private void AddMacroParameter(ICollection<MacroNavigator.MacroParameter> parameters, NavigableNavigator contentNavigator, NavigableNavigator mediaNavigator, string macroPropertyAlias,string macroPropertyType, string macroPropertyValue) { // if no value is passed, then use the current "pageID" as value var contentId = macroPropertyValue == string.Empty ? UmbracoContext.Current.PageId.ToString() : macroPropertyValue; TraceInfo("umbracoMacro", "Xslt node adding search start (" + macroPropertyAlias + ",'" + macroPropertyValue + "')"); // beware! do not use the raw content- or media- navigators, but clones !! switch (macroPropertyType) { case "contentTree": parameters.Add(new MacroNavigator.MacroParameter( macroPropertyAlias, contentNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty attributes: new Dictionary<string, string> { { "nodeID", contentId } })); break; case "contentPicker": parameters.Add(new MacroNavigator.MacroParameter( macroPropertyAlias, contentNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty 0)); break; case "contentSubs": parameters.Add(new MacroNavigator.MacroParameter( macroPropertyAlias, contentNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty 1)); break; case "contentAll": parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, contentNavigator.Clone())); break; case "contentRandom": var nav = contentNavigator.Clone(); if (nav.MoveToId(contentId)) { var descendantIterator = nav.Select("./* [@isDoc]"); if (descendantIterator.MoveNext()) { // not empty - and won't change var descendantCount = descendantIterator.Count; int index; var r = library.GetRandom(); lock (r) { index = r.Next(descendantCount); } while (index > 0 && descendantIterator.MoveNext()) index--; var node = descendantIterator.Current.UnderlyingObject as INavigableContent; if (node != null) { nav = contentNavigator.CloneWithNewRoot(node.Id.ToString(CultureInfo.InvariantCulture)); parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, nav, 0)); } else throw new InvalidOperationException("Iterator contains non-INavigableContent elements."); } else TraceWarn("umbracoMacro", "Error adding random node - parent (" + macroPropertyValue + ") doesn't have children!"); } else TraceWarn("umbracoMacro", "Error adding random node - parent (" + macroPropertyValue + ") doesn't exists!"); break; case "mediaCurrent": parameters.Add(new MacroNavigator.MacroParameter( macroPropertyAlias, mediaNavigator.CloneWithNewRoot(contentId), // null if not found - will be reported as empty 0)); break; default: parameters.Add(new MacroNavigator.MacroParameter(macroPropertyAlias, HttpContext.Current.Server.HtmlDecode(macroPropertyValue))); break; } }