Бритва: почему моя переменная не находится в области видимости - PullRequest
20 голосов
/ 20 мая 2011
@inherits umbraco.MacroEngines.DynamicNodeContext
@using System.Collections;

@{ List<string> qa = new List<string>(); } //this is not defined in the recursive helper below

@helper traverseFirst(dynamic node){
   var items = node.Children.Where("umbracoNaviHide != true");
   foreach (var item in items) {
     foreach(var subItem in item.Descendants()) {
        if(subItem.Id == Model.Id)
        {
           qa.Add();
           break;
        }
     }
     @traverseFirst(item)
   }
}

@traverseFirst(@Model.AncestorOrSelf("Book"))

Переменная qa не может быть доступна в рекурсивном помощнике. Есть ли способ обойти это?

Ответы [ 2 ]

34 голосов
/ 20 мая 2011

Определить переменную в секции @functions.

Обычный @{ помещает ваш код в тело какого-либо метода. Используйте @functions для определения членов класса.

@functions{ List<string> qa = new List<string>(); } 

Подробнее по этому вопросу: SLaks Рассекающая бритва серия.

0 голосов
/ 13 февраля 2017

В Razor 3.2.3 кажется, что переменная, объявленная в @functions, должна быть объявлена ​​static.Кажется неудачным.Пожалуйста, поправьте меня, если есть альтернативный способ.

@functions
{
    static List<string> qa = new List<string>();
}

@helper traverseFirst(dynamic node)
{
   var items = node.Children.Where("umbracoNaviHide != true");
   foreach (var item in items) {
     foreach(var subItem in item.Descendants()) {
        if(subItem.Id == Model.Id)
        {
           qa.Add();
           break;
        }
     }
     @traverseFirst(item)
   }
}
...