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

Umbraco ModelsBuilder-如何从子节点获取强类型对象,umbraco,umbraco7,Umbraco,Umbraco7,我正在使用Umbraco的ModelsBuilder从我的文档类型生成强类型模型,以便在代码中使用 这工作得很好,但我想知道如何为任何给定生成模型的子对象获取强类型对象 以下是一个例子: 公共行动结果索引(主页模型) { var组件=模型 .Children.Where(x=>x.DocumentTypeAlias==PageComponentsFolder.ModelTypeAlias) .单身()儿童; } HomePage是由Umbraco model builder生成的强类型类。在H

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

这工作得很好,但我想知道如何为任何给定生成模型的子对象获取强类型对象

以下是一个例子:

公共行动结果索引(主页模型)
{
var组件=模型
.Children.Where(x=>x.DocumentTypeAlias==PageComponentsFolder.ModelTypeAlias)
.单身()儿童;
}
HomePage是由Umbraco model builder生成的强类型类。在HomePage节点下,我有一个PageComponents文件夹,其中有几个其他节点都继承自ComponentsBaseClass

如何使我的组件在强类型对象列表上方变为变量


这可能吗?

好的,这就是我最后的结论,下面是一个如何使用由Umbraco model binder生成的强类型模型的示例

var components=model.Children
.Where(x=>x.DocumentTypeAlias==PageComponentsFolder.ModelTypeAlias)
.单身()儿童;
foreach(组件中的var组件)
{    
字符串componentNodeTypeAlias=component.DocumentTypeAlias;
开关(组件NodeTypeAlias)
{
案例SimpleHero.ModelTypeAlias:
Html.Partial(“component_simpleHero”,组件为simpleHero)
打破
case VideoWithHtml.ModelTypeAlias:
Html.Partial(“组件”\u videoWithHTML”,组件为videoWithHTML)
打破
}
}

在Umbraco中,您可以将特定类型的孩子作为目标,如下所示:

IEnumerable childrenOfType=model.Children();
这将返回类型为
YourModel
 — 它本质上结合了
Where()
Cast()

要回答你的问题“这可能吗”,答案是否定的

你不能拥有你所追求的那种“强类型对象列表”,因为在C#中,列表(或其他IEnumerable)总是一个普通类型的列表,例如
list
。对于Umbraco,它们都共享一个
IPublishedContent
的界面。您可以遍历该列表并计算出每个对象的实际类型。在Umbraco中,列表中的IPPublishedContent实际上不会使用ModelsBuilder中的类型,除非您强制转换它们

foreach(CollectionofPublishedContent中的IPPublishedContent c)
{
//基本if
如果(c.DocumentTypeAlias==YourModel.ModelTypeAlias)
{
您的模型stronglyTypedContent=c作为您的模型;
//做点什么
}
//或切换。。。
开关(c.DocumentTypeAlias)
{
案例YourModel.ModelTypeAlias:
您的模型stronglyTypedContent2=c作为您的模型;
//做一件事
打破
}
//或者使用带有空检查的隐式强制转换
您的模型stronglyTypedContent3=c作为您的模型;
如果(stronglyTypedContent3!=null)
{
//恭喜你,你的内容和你的模型一样
}
}

与我的答案基本相同,对吗?感谢您的澄清。@AyoAdesina尽管您的代码可能会解决您的特定问题,但它并没有严格回答您提出的问题:“如何为任何给定生成模型的子对象获取强类型对象?”以及“如何使我的组件变为强类型对象列表上方的变量”。因此,需要另一个答案/澄清。