Недавно я обновил Umbraco с 4.7.2 до 7.1.9 и сейчас медленно конвертирую все устаревшие макроскрипты в макросы частичного просмотра. Я столкнулся с несколькими проблемами при использовании DescendantsOrSelf для перебора узлов.
У меня есть макрос, который генерирует боковое меню для моего сайта (интранет). В версии 4 макрос работал должным образом на всем сайте, отображая соответствующее меню на главной странице и различные боковые меню на дочерних страницах.
После обновления следующее условие:
var model = GetParentSideMenu(CurrentPage);
@if (CurrentPage.AncestorsOrSelf("umbSomePageType").Where("Visible").First().HasValue("PageName") && CurrentPage.AncestorsOrSelf("umbSomePageType").Where("Visible").First().Id != model.Id)
{ ... }
@functions
{
public dynamic GetParentSideMenu(dynamic model)
{
if (model.Level > 1)
{
do
{
if (model.umbSideMenuLinks.Count() > 0)
{
return model;
}
if (model.Level > 1) {
model = model.Up();
} else { break; }
} while (model.Up() != null);
return model;
}
else return model;
}
}
Генерирует следующую ошибку при отображении на главной странице:
System.InvalidOperationException {"Sequence contains no elements"}
Inner Exception is null
Понимание здесь заключается в том, что отображаемая страница не является «umbSomePageType», поэтому это условие должно быть ложным и двигаться дальше, но вместо этого выдает указанное выше исключение.
Макрос отлично работает при отображении на странице «umbSomePageType», но поскольку пользователю разрешено иметь дополнительные подстраницы другого типа в разделе «umbSomePageType», мне нужно вручную проверить «DocumentTypeAlias» и убедиться, что другие операторы if проверяют это тип подстраницы не выполняется, потому что я получаю ту же ошибку, что и выше.
Еще одна проблема, с которой я сталкиваюсь, заключается в том, что это не возвращает итерируемую коллекцию, когда она использовалась раньше в версии 4:
@if (model.DescendantsOrSelf("umbSideMenuLinks").Where("Visible").Count() > 0)
{
foreach (var item in model.DescendantsOrSelf("umbSideMenuLinks").Where("Visible").First().Children)
{ ... }
.... }
Условие if возвращает true, но foreach не может получить какие-либо элементы для итерации.
Любая помощь здесь будет принята с благодарностью.
Благодарю вас.