Функция не «выходит», как ожидалось - PullRequest
0 голосов
/ 04 октября 2018

У меня (в Умбрако) родительский узел, дочерний элемент родительского элемента и дочерний элемент дочернего элемента.Все три узла имеют общее свойство комментария, возможно, что все 3 узла будут заполнены этим свойством или любой их комбинацией.

По сути, мне нужно знать, что текущий узел, на который я смотрю, заполнил это свойство, и еслине проверять родительский и т. д. рекурсивно вверх по дереву.

Итак, я написал следующий метод:

    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) ничего не находит 2) Затем вызывается функция, передающая родительский элемент текущей страницы. 3) Находит значение и нажимает «return Int32.Parse (targetNode.Id.ToString ());».4) Затем он продолжает проверять дерево *, т. Е. Затем попадает в строку 'getRecursiveNodePropertyParent (myparentNode, alias);'

  • Это то, что я не так точно понимаю, когда строка 'возвращает Int32.Parse (targetNode.Id.ToString ());»должен привести к тому, что подпрограмма завершится и вернет правильный идентификатор, но блок кода не завершится.

Может ли кто-нибудь указать мне правильное направление, пожалуйста?

Спасибо, C

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

В вашем коде вы не возвращаетесь в

getRecursiveNodePropertyParent(myparentNode, alias);

, вместо этого он продолжается и достигает последней строки с

return 0;

Возможно, вам следует вернутьсязначение первого?Я не знаю остальную часть вашего кода, но, возможно, это уже все.

0 голосов
/ 13 октября 2018

Umbraco имеет эту функциональность из коробки, нет необходимости в дополнительном коде.

Предполагая, что вы используете V6 или V7 вместо использования представления содержимого Node, используйте IPublishedContent, который имеет методназывается GetPropertyValue, который вы можете сказать, чтобы восстановить дерево.Так, например, вы можете сделать что-то вроде:

var propertyValue = content.GetPropertyValue<string>("myAlias", recursive: true);

Что будет означать, что propertyValue будет иметь значение узла содержимого, если он установлен, в противном случае он автоматически найдет дерево для вас и найдет его..

0 голосов
/ 04 октября 2018

Вы ничего не делаете с возвращаемым значением рекурсивного вызова.Затем выполнение продолжается через функцию, в конечном итоге возвращая 0. Похоже, вы хотите вернуть ее:

// ...
if (found == "")
{
    Node myparentNode = new Node(targetNode.Parent.Id);
    return getRecursiveNodePropertyParent(myparentNode, alias);
 // ^^^^^^
}
else
{
    return Int32.Parse(targetNode.Id.ToString());
}

Теперь вы даже можете избавиться от return 0; в конце, поскольку обе ветви if-else вернуть значение.

...