Как составить список товаров в контейнере Orchard? - PullRequest
3 голосов
/ 21 января 2012

На моем сайте Orchard есть тип контента с именем Product.У этого есть Контейнер частей и Routable.Продукты могут содержать тип содержимого с именем ProductFeature.

Я переопределил представление Content-Product.cshtml, чтобы изменить HTML при просмотре URL-адреса маршрута. В этом представлении, как я могу получить список всех ProductFeature, которые содержит Продукт?

В этом посте показано, как это сделать для виджета блога.http://weblogs.asp.net/bleroy/archive/2011/03/27/taking-over-list-rendering-in-orchard.aspx

Мне трудно найти способ сделать это в представлении содержимого Продукта.Код из приведенного выше примера выдает ошибку исключения null, поэтому структура модели должна быть другой.Я пытался посмотреть на модель, используя Shape Tracing или отладку в Visual Studio, но не смог найти содержащиеся в ней элементы.

Любая помощь будет признательна.

Ответы [ 3 ]

2 голосов
/ 16 февраля 2014

Есть два варианта, которые я использую (я знаю, что Бертран назовет их уродливыми и ненужными, так как он усердно работал, чтобы дать нам много других инструментов, но если вы либо не поняли всю красоту Орчарда и то, насколько он гениален Вам нужны эти хаки.)

Итак, вот 2:

  1. Создать частичное представление Parts.Container.Contained-YourContentTypeName.cshtml

    внутри

    @foreach (var p in Model.List.Items)
    {
       // regular content parts, Title and Body
       string title = p.ContentItem.TitlePart.Title;
       string body = p.ContentItem.BodyPart.Text;
    
       // Your custome content parts
       string something = p.ContentItem.YourContentPartName.YourContentPartFieldName.Value;
    }
    
  2. в Content-YourContentTypeName.cshtml:

    var yourList = Model.Content.Items[1].List.Items;
    

По крайней мере это Items[1] в моем случае, вы можете проверить с помощью трассировки формы в модели, где находится список. И с этого момента все так же, как 1).

Надеюсь, это поможет кому-то, кто наткнется на эту нить, ищет это решение, как я это делал несколько недель назад.

2 голосов
/ 21 января 2012

Если вы уверены, что ваш файл location.info включает в себя контейнерную часть, то ваш список функций уже должен отображаться.

0 голосов
/ 04 ноября 2016

Чтобы расширить ответ Зорана, если вы не хотите жестко кодировать позицию Контейнера в списке элементов, вы можете использовать LINQ:

IEnumerable<dynamic> items = Model.Content.Items;
var container = (from item in items
                 where (item.ContentPart.PartDefinition.Name == "ContainerPart")
                 select item).ElementAt(0);

...

@Display(container.List.Items)
...