Umbraco ModelsBuilder - 如何从子节点获取强类型对象

时间:2018-06-09 18:17:14

标签: umbraco umbraco7

我正在使用Umbraco的ModelsBuilder从我的文档类型中生成强类型模型,以便在我的代码中使用。

这非常有效,但我想知道如何为任何给定生成模型的子项获取强类型对象。

以下是一个例子:

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

HomePage是由Umbraco模型构建器生成的强类型类。在主页节点下,我有一个页面组件文件夹,其中有几个所有节点都继承自ComponentsBaseClass。

如何使我的组件变量高于强类型对象列表。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以像这样在Umbraco中针对特定类型的孩子:

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

这将返回类型为YourModel的模型的所有子级-essentially实际上将Where()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
    }
}

答案 1 :(得分:0)

好的,这就是我最终得到的结果,这是一个如何使用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;
    }
}