Используя Umbraco 4.6+, есть ли способ получить все узлы определенного типа doctype в С#? Я смотрел в пространстве имен umbraco.NodeFactory
, но пока не нашел ничего полезного.
Umbraco 4.6+ - Как получить все узлы doctype в С#?
Ответ 1
Я просто делал это сегодня, что-то вроде приведенного ниже кода должно работать (используя umbraco.presentation.nodeFactory), назовите его с nodeId из -1, чтобы получить root node сайта и позволить ему работать по-своему вниз:
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);
}
}
Ответ 2
Предполагая, что вам понадобится только несколько узлов определенного типа, было бы более эффективно использовать ключевое слово yield, чтобы избежать получения большего, чем вам нужно:
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;
}
Итак, ваш последний вызов для получения узлов по типу будет:
new Node(-1).GetDescendants().Where(x => x.NodeTypeAlias == "myNodeType")
Итак, если вы хотите только получить первые пять, вы можете добавить .Take(5) в конец, и вы будете выполнять только первые 5 результатов, а не вытаскивать все дерево.
Ответ 3
Или рекурсивный подход:
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...
}
Ответ 4
Если вы просто создаете файл сценария бритвы, который будет использоваться макросом (Umbraco 4.7+), я нашел эту стенографию особенно полезной...
var nodes = new Node(-1).Descendants("DocType").Where("Visible");
Надеюсь, это поможет кому-то!
Ответ 5
В umbraco 7.0+ вы можете сделать это так:
foreach (var childNode in node.Children<ChildNodeType>())
{
...
}