我(在Umbraco中)有一个父节点,一个父节点的孩子和一个孩子的孩子。这三个节点都共享一个comment属性,这三个节点都有可能填充此属性或其任意组合。
基本上,我需要知道要查看的当前节点具有此属性,如果没有,则检查父节点,以此类推。
所以我写了以下方法:
public int getRecursiveNodePropertyParent (Node targetNode, string alias)
{
//does this node have the property?
var found = getNodeProperty(targetNode.Id, alias);
if (found == "")
{
Node myparentNode = new Node(targetNode.Parent.Id);
getRecursiveNodePropertyParent(myparentNode, alias);
}
else
{
return Int32.Parse(targetNode.Id.ToString());
}
return 0;
}
如果我正在查看的当前页面具有该属性,则该函数可以正常工作,但是如果当前页面不具有该属性,但其父级却具有该属性,则该函数将无法正常工作。
基本上会发生什么: 1)它检查当前页面,但未发现任何内容 2)然后调用在当前页面的父级中传递的函数 3)找到值并点击“返回Int32.Parse(targetNode.Id.ToString());” 4)然后继续检查树*,即,然后击中'getRecursiveNodePropertyParent(myparentNode,alias);'
有人可以指出我正确的方向吗?
谢谢, C
答案 0 :(得分:2)
您对递归调用的返回值不做任何事情。然后继续执行该函数,最终返回0。您似乎想返回它:
DaggerAppCompatActivity
由于// ...
if (found == "")
{
Node myparentNode = new Node(targetNode.Parent.Id);
return getRecursiveNodePropertyParent(myparentNode, alias);
// ^^^^^^
}
else
{
return Int32.Parse(targetNode.Id.ToString());
}
的两个分支都返回一个值,因此您甚至可以立即删除return 0;
。
答案 1 :(得分:0)
在您的代码中,您没有返回
getRecursiveNodePropertyParent(myparentNode, alias);
相反,它继续并用
到达最后一行返回0;
也许您应该返回第一个的值?我不知道您的其余代码,但也许已经足够了。
答案 2 :(得分:0)
Umbraco开箱即用,无需任何其他代码。
假定您使用的是V6或V7,而不是内容的Node表示形式,请使用IPublishedContent,它具有一个称为GetPropertyValue的方法,您可以告诉该方法递归树。因此,例如,您可以执行以下操作:
var propertyValue = content.GetPropertyValue<string>("myAlias", recursive: true);
这将意味着propertyValue将具有内容节点的值(如果已设置),否则它将自动为您递归树并寻找它。