Umbraco ModelsBuilder - Как получить строго типизированные объекты из дочерних узлов - PullRequest
0 голосов
/ 09 июня 2018

Я использую ModelsBuilder от Umbraco для генерации строго типизированных моделей из моих типов документов для использования в моем коде.

Это работает довольно хорошо, но я хочу знать, как я могу получить строго типизированные объекты для детейлюбой сгенерированной модели.

Вот пример:

public ActionResult Index(HomePage model)
{
    var components = model
        .Children.Where(x => x.DocumentTypeAlias == PageComponentsFolder.ModelTypeAlias)
        .Single().Children; 
}

HomePage - строго типизированный класс, созданный конструктором моделей Umbraco.Под узлом домашней страницы у меня есть папка компонентов страницы с несколькими другими узлами, которые все наследуются от ComponentsBaseClass.

Как сделать мои компоненты переменными над строго типизированным списком объектов.

Isэто возможно?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы можете настроить таргетинг на детей определенного типа в Umbraco следующим образом:

IEnumerable<YourModel> childrenOfType = model.Children<YourModel>();

Это вернет всех потомков модели с типом YourModel - в сущности, она объединяет Where() и a Cast<T>()

Чтобы ответить на ваш вопрос «возможно ли это», ответ «нет».

Вы не можете иметь «строго типизированный список объектов», который вы ищете, потому чтов C # список (или другой IEnumerable) всегда является списком общего типа, например List<ACommonType>.В случае Umbraco все они имеют интерфейс IPublishedContent.Вы можете перебирать этот список и определять фактический тип каждого объекта.В Umbraco IPublishedContent в списке фактически не использует типы из ModelsBuilder до тех пор, пока вы их не приведете.

foreach(IPublishedContent c in collectionOfIPublishedContent)
{
    // basic if
    if (c.DocumentTypeAlias == YourModel.ModelTypeAlias)
    {
        YourModel stronglyTypedContent = c as YourModel;
        // do some stuff
    }

    // or switch...
    switch (c.DocumentTypeAlias)
    {
        case YourModel.ModelTypeAlias:
            YourModel stronglyTypedContent2 = c as YourModel;
            // do a thing
            break;
    }

    // or use implicit casts with null checking
    YourModel stronglyTypedContent3 = c as YourModel;
    if (stronglyTypedContent3 != null)
    {
        // congrats, your content is of the type YourModel
    }
}
0 голосов
/ 10 июня 2018

Хорошо, это то, что я закончил в конце, вот пример того, как использовать строго типизированные модели, сгенерированные механизмом связывания моделей Umbraco.

var components = model.Children
    .Where(x => x.DocumentTypeAlias == PageComponentsFolder.ModelTypeAlias)
    .Single().Children; 

foreach (var component in components)
{    
    string componentNodeTypeAlias = component.DocumentTypeAlias;

    switch (componentNodeTypeAlias)
    {
        case SimpleHero.ModelTypeAlias:
            Html.Partial("component_simpleHero", component as SimpleHero)
            break;

        case VideoWithHtml.ModelTypeAlias:
            Html.Partial("component_videoWithHTML", component as VideoWithHtml)
            break;
    }
}
...