Извиняюсь за зубодробительный заголовок.
Хотел бы поделиться с коллегами решением (возможно велосипедным, потому как штатного метода решения подобных вопросов я могу просто не знать).
Сперва предисловие для незнакомых с Orchard CMS
Это система базирующаяся на MVC.NET и как у любого MVC, у неё имеется модель, представление и контроллер, для всего чего угодно почти.
Есть у Orchard и много дополнительных сущностей, но не в том суть дела.
А дело в том, что правильно задав имя представления, можно подменять уже существующие представления. Как именно это делать, кстати рассказано вот в этой статье (eng)
А ещё в Orchard почти всё является контентом и может быть обработано и выведено на экран штатными средствами. Контент бывает Content Part и Content Field, но это тоже не важно, а важно, что контент можно создавать как в коде, путём написания собственных модулей описывающих те самые модели, контроллеры и др. обвеску, так и из панели управления - в визуальном режиме добавляя, настраивая и комбинируя те или иные поля и части контента.
Когда мы совмещаем обе части вышеописанного и пытаемся создать собственное представление для некого типа определённого в коде и имеющего соответственно модель, то ни каких проблем - мы используем эту самую модель для доступа к полям той части контента, для которой рисуем представление.
Когда же мы пытаемся проделать то-же самое для типа созданного из панели управления, то обнаруживается, то у него собственно нет модели - соответствующий объект является динамическим типом!
Итак, задача: создать альтернативное представление для определённого из панели управления контентного типа.
После некоторых изысканий, наметился нижеописанный путь решения проблемы выковыривания данных о наличных объектах и некторой типизации модели.
Соответственно в cshtml файле мы пишем нижеследующий код и имеем словарик с данными и метаданными объектов модели.
@using Orchard.ContentManagement; @{ IEnumerable<dynamic> items = Model.Content.Items; var fields = items.ToDictionary(it => it.ContentField.Name, it => new{ ContentField = (Orchard.ContentManagement.ContentField)it.ContentField }); }
.