tutorial c# api umbraco

tutorial - Umbraco 4.6+-¿Cómo obtener todos los nodos por doctype en C#?



umbraco documentation (5)

Usando Umbraco 4.6+, ¿hay una manera de recuperar todos los nodos de un doctype específico en C #? He estado buscando en el espacio de nombres umbraco.NodeFactory , pero no he encontrado nada útil todavía.


En umbraco 7.0+ puedes hacerlo así.

foreach (var childNode in node.Children<ChildNodeType>()) { ... }


O un enfoque recursivo:

using umbraco.NodeFactory; private static List<Node> FindChildren(Node currentNode, Func<Node, bool> predicate) { List<Node> result = new List<Node>(); var nodes = currentNode .Children .OfType<Node>() .Where(predicate); if (nodes.Count() != 0) result.AddRange(nodes); foreach (var child in currentNode.Children.OfType<Node>()) { nodes = FindChildren(child, predicate); if (nodes.Count() != 0) result.AddRange(nodes); } return result; } void Example() { var nodes = FindChildren(new Node(-1), t => t.NodeTypeAlias.Equals("myDocType")); // Do something... }


Si solo está creando un archivo de scripts de afeitar para que lo utilice una macro (Umbraco 4.7+), encontré esta taquigrafía particularmente útil ...

var nodes = new Node(-1).Descendants("DocType").Where("Visible");

Espero que esto ayude a alguien!


Simplemente estaba haciendo esto hoy, algo como el código a continuación debería funcionar (usando umbraco.presentation.nodeFactory), llámelo con un nodeId de -1 para obtener el nodo raíz del sitio y deje que funcione hacia abajo:

private void DoSomethingWithAllNodesByType(int NodeId, string typeName) { var node = new Node(nodeId); foreach (Node childNode in node.Children) { var child = childNode; if (child.NodeTypeAlias == typeName) { //Do something } if (child.Children.Count > 0) GetAllNodesByType(child, typeName); } }


Suponiendo que solo necesite un par de nodos del tipo en particular, sería más eficiente usar la palabra clave de rendimiento para evitar recuperar más de lo necesario:

public static IEnumerable<INode> GetDescendants(this INode node) { foreach (INode child in node.ChildrenAsList) { yield return child; foreach (INode grandChild in child.GetDescendants()) { yield return grandChild; } } yield break; }

Así que tu llamada final para obtener nodos por tipo será:

new Node(-1).GetDescendants().Where(x => x.NodeTypeAlias == "myNodeType")

Por lo tanto, si solo desea obtener los primeros cinco, puede agregar .Take (5) al final y solo responderá a través de los primeros 5 resultados en lugar de extraer todo el árbol.