我正在使用Umbraco的ModelsBuilder从我的文档类型中生成强类型模型,以便在我的代码中使用。
这非常有效,但我想知道如何为任何给定生成模型的子项获取强类型对象。
以下是一个例子:
public ActionResult Index(HomePage model)
{
var components = model
.Children.Where(x => x.DocumentTypeAlias == PageComponentsFolder.ModelTypeAlias)
.Single().Children;
}
HomePage是由Umbraco模型构建器生成的强类型类。在主页节点下,我有一个页面组件文件夹,其中有几个所有节点都继承自ComponentsBaseClass。
如何使我的组件变量高于强类型对象列表。
这可能吗?
答案 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;
}
}