2015-01-15 3 views
3

Эй, ребята, у меня есть вопрос, который заставил меня застрять на 2 часа.Orchard получить свойство динамического объекта (виджет Container)

1) Я создал аа нового типа контента под названием «слайдер горки» (вероятно, изменит это ужасное имя)

2) Создано Список Slider сползает

3) Добавлен новый виджет-контейнер и сказал он должен содержать мой список слайдеров

4) Создал мой .cshtml файл для слайдера.

Теперь все это отлично работает, и я получаю информацию, отображаемую на моей домашней странице, в расширенном разделе макета. В тот момент, когда я хочу начать редактирование необработанных данных в хороший слайдер, первые вещи - это итерация этой модели и получение каждого слайда, чтобы я мог извлечь свойства и сделать что-то с ними.

Однако, как его динамический объект (форма сада), нет никакого интеллигенса, которого, конечно же, следует ожидать. Однако я старался изо всех сил, чтобы получить собственность.

Ive пытался http://docs.orchardproject.net/Documentation/Creating-lists

Ive также попытался http://www.ideliverable.com/blog/ways-to-render-lists-of-things

Оба хороши читает, но моя методология делать с виджетами, и я не уверен, что если его из-за этого, что я не могу показаться, чтобы легко найти собственность мне нужна. Я попытался пройти и осмотреть динамическую модель, но метаданные не содержат ничего, что напоминает свойство.

Код настоящее время у меня

@Display(Model.Content) 
@{ 
    var MySliderList = Model.List; 

} 

<div> 
    @foreach (var slide in MySliderList) 
    { 
     <div>@slide.Title</div> 
     <div>@slide.SliderText</div> 
     <div>@slide.UrlLink</div> 
    } 
</div> 

Как вы можете сказать, этот код оленья кожа дисплея ничего другого, кроме @display (model.content).

Может ли кто-нибудь сказать мне правильный способ получить данные каждого «слайда» из модели на этом .cshtml?

Большое спасибо.

UPDATE: Также обратите внимание на код, который я есть последняя попытка, ив также попытался Model.ContentItem, ContentItems, ContentItems.Content, содержание и т.д. и т.п.

+0

Каково имя файла cshtml? –

+0

Widget-Name-mySlider.cshtml, я использовал модуль формы для извлечения и автоматического генерации файла. – lemunk

+0

Я также пытаюсь сделать то же самое, но вместо этого использовать проекцию с запросом, но я не уверен, как обращаться к каждому экземпляру типа содержимого. – lemunk

ответ

4

Т.Л., др; используйте прогнозы, пропустите внизу ссылки, например.

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

Виджет, который вы пытаетесь переопределить (как объяснил Бертран), в основном представляет собой файл мини-макета, который будет отображать части, которые были заброшены в зону «Контент». Эти части включают такие вещи, как WidgetPart (который отображает заголовок виджетов) и WidgetContainerPart, который отображает список слайдеров Slides в вашем случае.

Однако вид виджета может иметь доступ ко всем его дочерним частям, как вы пытаетесь сделать, вместо того, чтобы позволить отдельным частям визуализировать их. Это может быть полезно в ситуациях, когда вам нужен очень специфический макет, требующий бит из нескольких частей и полей. Но доступ к виду может быть в основном свойствами части, поскольку они даны ей из модели/обработчика.ContainableWidgetPart строит список элементов контента для отображения внутри драйвера, поэтому вы не можете фактически получить доступ к этому списку из любого места вне представления, которое отображается драйвером (т. Е. Parts.ContainerWidget.cshtml). Но не бойтесь, мы можем просто создать этот список, если хотите.

@using Orchard.ContentManagement 
@using Orchard.Core.Common.Models 
@using Orchard.Core.Containers.Extensions; 
@{ 
    var item = Model.ContentItem; 
    var part = (Orchard.Core.Containers.Models.ContainerWidgetPart)Model.ContentItem.ContainerWidgetPart; 

    var _contentManager = WorkContext.Resolve<IContentManager>(); 
    var container = _contentManager.Get(part.Record.ContainerId); 

    IContentQuery<ContentItem> query = _contentManager 
     .Query(VersionOptions.Published) 
     .Join<CommonPartRecord>().Where(cr => cr.Container.Id == container.Id); 

    if (part.Record.ApplyFilter) { 
     query = query.Where(part.Record.FilterByProperty, part.Record.FilterByOperator, part.Record.FilterByValue); 
    } 

    var items = query.Slice(0, part.Record.PageSize).ToList(); 

} 

@foreach (var i in items) { 
    // do stuff with the item here 
} 

Но наличие этого дерьма в представлении не особенно приятно. Итак, давайте посмотрим на ContainerWidgetPart. Что происходит в драйвере, так это то, что он создает форму списка, которая является основной формой. Orchard обеспечивает визуализацию списка элементов контента. Довольно аккуратно и легко. И если вы внимательно посмотрите на драйвер ContainerWidgetPart, вы увидите, что он создает представление с типом отображения «Сводка», отображаемым в списке. Таким образом, мы могли бы просто переопределить отображение слайдов слайдера с помощью мест размещения, чтобы отображать только изображение (которое, как я полагаю, у вас есть). Однако, если вы используете слайд, может потребоваться добавить определенные классы или настраиваемые атрибуты в элементы ul и li. Это легко достигается с помощью переопределения формы Parts.ContainerWidget.cshtml в нашей теме и добавить следующие строки:

// adds the class slider to the ul 
Model.ContentItems.Classes.Add("slider"); 
// adds a class slider-item to each li 
Model.ContentItems.ItemClasses.Add("slider-item"); 
// adds a custom attribute to each li 
Model.ContentItems.ItemAttributes.Add("style", "display:none"); 

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

Так что после всего этого я рекомендую вам использовать проекцию для создания слайдера. Прогнозы намного более гибкие, более холодные, и вы можете создавать шаблоны badass для них. Проверьте эти примеры того, как построить ползунок с помощью проекций:

Или еще лучше, даже не использовать слайдер, потому что никто не любит они все равно^_^Надеюсь, я вас достаточно смутил, теперь я понятия не имею, что происходит!

+0

отличная информация, да, в то время, когда я привык к целому «heres my viewmodel, теперь прокручиваю и делаю вещи на моем представлении». Я использовал проекцию вместо списка, но моя проблема заключалась в том, что я попытался сделать то же самое снова, Ill взгляните позже, затем примите. спасибо за помощь Хазза – lemunk