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.