Orchard 获得 属性 个动态对象(小部件容器)

Orchard get property of dynamic object(widget Container)

我有一个问题让我现在被困了 2 个小时。

  1. 我创建了一个名为“slider slides”的新内容类型(可能会改变那个可怕的名字)
  2. 创建了一个滑块列表
  3. 添加了一个新的容器小部件并告诉它包含我的滑块列表
  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 等

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

Orchard 最棒的(也许也是最糟糕的)事情是有一百万种方法可以实现你想要的哈哈。

您试图覆盖的小部件视图(如 Bertrand 所解释的)基本上是一个迷你布局文件,它将呈现已放入 "Content" 区域的部分。这些部分包括诸如 WidgetPart(显示小部件标题)和 WidgetContainerPart(显示您的案例中的滑块列表)之类的东西。

但是,Widget 视图可以访问它的所有 child 部分,而不是让各个部分呈现它们。这在您需要非常具体的布局来调用来自多个部分和字段的位的情况下非常有用。但是视图可以访问的基本上是部件的属性,因为它们是从 model/handler 赋予它的。 ContainableWidgetPart 构建其内容项列表以显示在 driver 中,因此您实际上无法从 driver 呈现的视图(即 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。 driver 中发生的事情是它创建了一个列表形状,这是 Orchard 提供的用于呈现内容项列表的核心形状。非常简洁和容易。如果您仔细查看 ContainerWidgetPart driver,您会发现它正在构建一个显示类型为 "Summary" 的视图,以显示在列表中。因此,我们可以考虑仅使用放置来覆盖 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 访问列表形状中的单个项目,但是当您已经构建了一堆要显示的形状然后您继续绕过所有这些时,这似乎有点愚蠢。

所以在这之后,我建议您使用投影来构建您的滑块。投影更灵活,更酷,您可以为它们创建 badass 模板。查看这些关于如何使用投影构建滑块的示例:

或者更好的是,甚至不要使用滑块,因为无论如何都没有人真正喜欢它们^_^ 希望我已经把你搞糊涂了,我现在不知道发生了什么!