组合、强类型视图和部分视图(组合继承)

Compositions, strongly typed Views and Partial Views (Inheritance with compositions)

首先,我对 Umbraco 7.4.3 比较陌生,所以也许我只是想以错误的方式来做这件事?我希望社区可以让我直截了当。生活中我真正想要的只是 Visual Studio 中的 IntelliSense 用于我的 DocumentTypes。

我正在尝试在我的 DocumentType 中使用组合(而不是主 DocumentType,这似乎是新版本中的前进方向)。但是我无法转换为组合的实例,这意味着该组合的部分视图会导致异常。

更多细节:

文档类型

模板

布局

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    Layout = null;
}

<html>
    <head>
        @RenderSection("Head", required: false)
    </head>
        @RenderBody()
    <body>
    </body>
</html>

首页

@inherits Umbraco.Web.Mvc.UmbracoViewPage<Home>
@using Umbraco.Web.CompiledViewModels
@{
    Layout = "Layout.cshtml";
}
@Section Head
{
    @Html.Partial("Seo")
}

<h1>My new home page</h1>

搜索引擎优化(部分)

@inherits Umbraco.Web.Mvc.UmbracoViewPage<Seo>
@using Umbraco.Web.CompiledViewModels

<title>Model.Title</title>

然而,当我查看主页时,我收到一个错误,提示 "Home" 类型无法转换为 "Seo" 类型。

查看已创建的模型,我可以看到 "Seo" 模型有一个相应的接口 "ISeo",由 "Home" 实现。所以我不太确定为什么它不能在这些类型之间进行转换。

我想为我的作品使用 stronly 类型的 PartialViews - 这是错误的吗?我应该使用其他东西吗?

我试过自己铸造模型,但并不愉快。

@Html.Partial("Seo", Model as Seo)

我认为在前端,无论您使用什么 Model/Document 类型,都会被视为 一个 文档类型,而不管它是由什么组成的。应该没有理由转换任何东西,因为 Seo 文档类型中的任何属性都应该是模型的一部分。至少这是我的理解。

我不知道 ModelsBuilder 作为核心的一部分工作得如何,但据我所知,它应该提供强类型模型(和 IntelliSense)。您是否检查过 Seo 属性是否还不是主页模型的一部分?

编辑

抱歉,我并不是真的想把这个作为答案,因为存在所有不确定性,甚至还有我自己的问题。我会把它留在这里,直到有人告诉我否则 ;-)

因为一个 DocType 可以分配多个组合,所以它们不能对组合的文档类型使用继承,因为在 C# 中不可能从多个 classes 继承。相反,他们创建了一个您在 post 中提到的接口,然后文档类型 class 和组合 class 都实现了它。然后,如果我没记错 doctype 上的属性,则调用组合 class 上的静态方法来获取值。因此,您应该能够使用界面,而不是在您的部分中使用以下内容:

@inherits Umbraco.Web.Mvc.UmbracoViewPage<Seo>

改用这个:

@inherits Umbraco.Web.Mvc.UmbracoViewPage<ISeo>