2015-01-15 61 views
3

嘿家伙我有一个问题,让我卡住了2个小时了。果园获取动态对象(widget容器)的属性

1)我创建迈上了一个新的内容类型,称为“滑滑梯”(可能会改变这种可怕的名字)

2)创建滑块的列表滑动

3)增加了一个新的Container的Widget,并告诉它包含我的滑块列表

4)为滑块小部件创建了我的.cshtml文件。

现在,所有这些工作都非常好,我在主页布局的特色部分显示了信息。在这一点上,我想开始编辑原始数据到一个漂亮的滑块,首先第一件事是迭代通过这个模型,并获取每张幻灯片,所以我可以提取属性并与他们做一些事情。

然而,作为一个动态的对象(果园形状),当然不会有任何智能感知。不过,我已尽全力想办法弄到房产。

我用尽http://docs.orchardproject.net/Documentation/Creating-lists

香港专业教育学院还试图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模型中获取每个“幻灯片”数据的正确方法吗?

非常感谢。

更新:也请注意代码中,我有最新的尝试,香港专业教育学院还试图Model.ContentItem,ContentItems,ContentItems.Content,内容等等等等

+0

cshtml文件的名称是什么? – 2015-01-15 17:32:21

+0

Widget-Name-mySlider.cshtml,我用形状模块来提取和自动生成文件。 – lemunk 2015-01-16 08:57:30

+0

即时通讯也试图相同,但使用投影与查询相反,同样的问题是我不知道如何访问内容类型的每个实例 – lemunk 2015-01-16 14:23:45

回答

4

TL;博士;使用投影,跳到底部,例如链接。

乌节的伟大的(也许是最坏的)事情是有一百万种方法来实现你想要的哈哈。

您尝试重写的窗口小部件视图(如Bertrand解释的)基本上是一个小型布局文件,它将渲染已被放入“内容”区域的部分。这些部分包括诸如WidgetPart(显示小部件标题)和WidgetContainerPart之类的内容,WidgetContainerPart会显示您的案例中的滑块幻灯片列表。

但是,Widget视图可以在您试图执行时访问其所有子部件,而不是让各个部件呈现它们。这在您需要非常特定的布局调用多个部分和字段的位的情况下非常有用。但是视图可以访问的基本上是该部分的属性,因为它们是从模型/处理程序提供给它的。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驱动程序,您将看到它正在构建一个显示类型为“摘要”的视图以显示在列表中。因此,我们可以看看只使用展示位置覆盖Slider Slide显示的显示,以仅显示图像(我假设您有这些图像)。但是,如果您使用幻灯片,则可能需要将某些类或自定义属性添加到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"); 

不过,如果你希望在无UL标签来显示您的内容,这是不是特别有用。您可以使用.Items从列表形状中访问各个项目,但是当您已经构建了一组要显示的形状时,这似乎有点愚蠢,然后您只需继续并绕过所有这些。

因此,毕竟,我建议你使用投影来建立你的滑块。投影更灵活,方式更酷,您可以为它们创建不错的模板。看看如何使用预测建立一个滑块这些例子:

或者更好的,甚至不使用滑块,因为没有人真正喜欢他们无论如何^ _ ^希望我充分混淆你,我现在不知道发生了什么事情!

+0

那里有很棒的信息,那么现在我已经习惯了整个“继承我的视角模型,现在循环播放,并在我的视图上做了些什么”。我已经使用投影而不是列表,但是我的问题是我试图再次做同样的事情,我稍后再看一下然后接受。感谢Hazza的帮助 – lemunk 2015-01-19 15:31:20