У меня есть модель представления, которая имеет свойство
public IRichTextContent Body { get; set; }
Этот интерфейс наследует IEnumerable<IRichTextBlock>
, и есть 3 интерфейса, которые наследуют IRichTextBlock
: IHtmlContent
, IInlineImage
и IInlineContentItem
, Все это входит в комплект поставки Kentico Kontent. NET SDK . Обычный рекомендуемый метод рендеринга для этого свойства:
@Html.DisplayFor(vm => vm.Body)
и все работает отлично. Для типов IInlineImage
и IHtmlContent
без шаблонов отображения в решении ASP. NET MVC вызывает для них метод ToString()
. Если я размещу шаблоны отображения для типов в решении, они будут выбраны и использованы. IInlineContentItem
имеет свойство типа object, которое может содержать различные фактические типы, и ASP. NET MVC правильно разрешает правильный шаблон отображения для этого объекта, предположительно из-за реализации IEnumerable<object>
(см. ). InlineContentItem ). Счастливые дни пока, разрешение шаблона метаданных pix ie magi c работает.
В некоторых сценариях ios Я хочу иметь возможность использовать различные шаблоны отображения, поэтому один шаблон отображения для Тип не будет работать. Поскольку свойство модели представляет собой коллекцию разных типов, я не могу сделать это в том виде, в каком оно есть. Поэтому я решил, что перечислю 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;
}
}
Для случая, когда я указываю шаблон, все работает нормально, правильный шаблон отправляется в шаблон. Однако случай переключения по умолчанию без шаблона теперь не разрешает ни базовый тип ToString()
, ни шаблоны отображения в моем решении. Вместо этого кажется, что шаблон ASP. NET MVC по умолчанию используется для IHtmlContent
, а для IInlineContentItem
.
ничего не отображается. Какая здесь разница между случаем, когда ASP. NET MVC правильно разрешает базовые типы при перечислении самой коллекции и случая, когда я делаю это? Люди обычно не имеют проблем с foreach над коллекцией, но я предполагаю, что проблема заключается в полиморфизме?