嘿伙计们,我有一个问题让我现在陷入了2个小时。
1)我创建了一个名为“滑块幻灯片”的新内容类型(可能会改变这个可怕的名字)
2)创建了Slider幻灯片列表
3)添加了一个新的Container Widget并告诉它包含我的Slider List
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,Content等等。
答案 0 :(得分:4)
<强> TL;博士;使用投影,跳到底部,例如链接。
关于乌节的伟大(也许是最糟糕的)事情是,有一百万种方法可以达到你想要的效果哈哈。
您试图覆盖的小部件视图(如Bertrand所解释的)基本上是一个迷你布局文件,它将渲染已被卡入“内容”区域的部分。这些部分包括WidgetPart(显示小部件标题)和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驱动程序,您将看到它正在构建一个视图,其显示类型为“Summary”,将显示在列表中。因此,我们可以看一下使用展示位置覆盖滑块幻灯片显示的显示,仅显示图像(我假设您已经在其上)。但是,如果您使用幻灯片,则可能需要将某些类或自定义属性添加到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从列表形状中访问各个项目,但是当您已经构建了一堆要显示的形状时,这似乎有点傻,然后您继续并绕过所有这些。
所以在这之后,我建议您使用投影来构建滑块。预测更灵活,更酷,您可以为它们创建badass模板。查看这些如何使用Projections构建滑块的示例:
或者更好的是,甚至不使用滑块因为没有人真的喜欢它们^ _ ^希望我把你弄糊涂了,我现在不知道发生了什么!