Umbraco.Web.Models.DynamicPublishedContentList не содержит определения для Count

Я получаю сообщение об ошибке в макросе Umbraco 7.0.3, который проходит через все дочерние элементы и возвращает немного больше, чем список. Для начала я использовал бэк-офис Umbraco для создания базовой навигации и элементов бокового меню. Между тем, как только локальная среда настроена, я начал работать локально.

Проблема в том, что код, который я создал с помощью бэк-офиса для навигации, работает нормально, но тот же код не работает, если элементы созданы в версии VS2012 Ultimate, даже если я просто вставляю тот же код из исходного рабочего макроса навигации.

Я получаю следующую ошибку: «Umbraco.Web.Models.DynamicPublishedContentList» не содержит определения «Любой», что предполагает, что список страниц является динамическим. К моему удивлению, тот же самый код работает для существующей навигации, тогда почему не с новыми элементами? Есть ли в VS2012 какая-либо настройка, при которой файл помечается как непригодный для использования с редакторами UTF8 или недопустимым html?

Мой вопрос: как я могу найти количество или любые элементы в макросе бритвы? Я уже пробовал количество Enumerable items и любые методы, но бесполезно.

Любые указатели на то, как найти количество существующих элементов, будут полезны.

Я предоставляю дополнительную информацию по запросу Пауло. Ошибка в строке "startNode.Children.Where("Visible").Any()". Ниже приведен код макроса:

@inherits Umbraco.Web.Macros.PartialViewMacroPage
@*
    === Macro Parameters To Create ===
    Show:True   Alias:nodeId Name:Node ID    Type:Content Picker
*@
@if (Model.MacroParameters["startNodeID"] != null)
{
    @* Get the start node as a dynamic node *@
    var startNode = Umbraco.Content(Model.MacroParameters["startNodeID"]);

    if (startNode.Children.Where("Visible").Any())
    {
        <div class="container">
            <div class="row">
                @foreach (var page in startNode.Children.Where("Visible"))
                { 
                    <div class="col-sm-3 col-md-3">
                        <div class="thumbnail">
                            <img src="~/images/Tiles/300x200.jpg" alt="@page.Name">
                            <div class="caption">
                                <h3><a href="@page.Url">@page.Name</a></h3>
                                <p>@page.GetPropertyValue("summary").Substring(0, 100)</p>
                                <a href="@page.Url" class="btn btn-default">Read More</a>
                            </div>
                        </div>
                    </div>
                }
            </div>
        </div>
    }
}

person Sanjay Zalke    schedule 17.03.2014    source источник
comment
Извините, но вы недостаточно исследовали. Вы не даете подробностей о проблеме тому, кто не знаком с Umbraco.   -  person Paulo Morgado    schedule 18.03.2014
comment
Привет, Пауло, я отредактировал вопрос и добавил больше информации, дайте мне знать, если это имеет больше смысла.   -  person Sanjay Zalke    schedule 25.03.2014
comment
Каков тип возвращаемого значения startNode.Children.Where("Visible")? Это IEnumerable<T>? Enumerable.Any(startNode.Children.Where("Visible")) работает?   -  person Paulo Morgado    schedule 26.03.2014


Ответы (2)


Я только что столкнулся с той же проблемой, и у меня сработало следующее: просто приведите ваше свойство umbraco к переменной DynamicPublishedContentList (при условии, что свойство действительно имеет такой тип).

Пример:

var homePage = CurrentPage.AncestorsOrSelf().Where("DocumentTypeAlias == @0", "yourPageAlias").FirstOrDefault();

var umbracoFolder = homePage.yourUmbracoFolderName;
var umbracoFolderItems = Umbraco.Content(umbracoFolder.ToString());

Umbraco.Web.Models.DynamicPublishedContentList yourList = umbracoFolderItems.yourItems as Umbraco.Web.Models.DynamicPublishedContentList;

yourList.Count() будет работать.

Обновление. Описанное выше работает, но вы можете облегчить себе жизнь, работая со списком вместо DynamicPublishedContentList, чтобы у вас были не только обычные методы расширения IEnumerable, но и индексаторы.

List<dynamic> items = new List<dynamic>(umbracoFolderItems.yourItems);
person Veverke    schedule 01.03.2015

Я предполагаю, что вам не хватает директивы using System.Linq.

person Paulo Morgado    schedule 18.03.2014
comment
Извини, Пауло, но это не сработало. Я считаю, что Umbraco по умолчанию добавляет все базовые/необходимые пространства имен. #не знаю - person Sanjay Zalke; 25.03.2014
comment
Я предполагаю, что есть метод Where, который принимает строку. Но, глядя на код, это может быть не намерение. Что ты пытаешься сделать? Можете ли вы предоставить эквивалентный код, отличный от LINQ? - person Paulo Morgado; 02.03.2015
comment
Это не работает, потому что методы расширения не могут быть связаны динамически, но вы можете легко это проверить: dynamic x = new int[10]; Console.WriteLine(x.Any()). Это не удастся - person Coastpear; 23.04.2015