我有一个具有属性的视图模型
public IRichTextContent Body { get; set; }
此接口继承,并且IEnumerable<IRichTextBlock>
有 3 个接口继承IRichTextBlock
:IHtmlContent
和。这些都是Kentico Kontent Delivery .NET SDK的一部分。此属性的正常推荐渲染方法是:IInlineImage
IInlineContentItem
@Html.DisplayFor(vm => vm.Body)
一切正常。对于IInlineImage
和IHtmlContent
类型,解决方案中没有显示模板,ASP.NET MVCToString()
对其调用方法。如果我在解决方案中放置类型的显示模板,那么这些模板将被拾取并使用。具有类型 object的IInlineContentItem
属性,可以保存各种实际类型,并且 ASP.NET MVC 正确解析此对象的正确显示模板,可能是由于IEnumerable<object>
实现(请参阅 InlineContentItem)。快乐的日子到目前为止,元数据模板解析小精灵的神奇作品。
在某些情况下,我希望能够使用不同的显示模板,因此该类型的单个显示模板将不起作用。由于模型属性是不同类型的集合,因此我无法按原样执行此操作。所以我想我会枚举IEnumerable<IRichTextBlock>
然后DisplayFor()
在需要的地方调用传递模板的类型。像这样的东西:
@foreach (var block in Model.Body)
{
@switch (block)
{
case Kentico.Kontent.Delivery.Abstractions.IInlineImage image:
@Html.DisplayFor(vm => image, "AmpInlineImage")
break;
default:
@Html.DisplayFor(vm => block)
break;
}
}
对于我指定模板的情况,这工作正常,正确的类型被发送到模板。但是,没有模板的默认 switch case 现在不能解析ToString()
我的解决方案中的基础类型或显示模板。相反,似乎默认的 ASP.NET MVC 对象模板IHtmlContent
用于IInlineContentItem
.
在枚举集合本身时 ASP.NET MVC 正确解析基础类型的情况与我这样做的情况有什么区别?人们通常似乎不会对集合上的 foreach 有问题,但我认为这里的问题是多态性?