如何在Orchard中自定义呈现列表时访问项目部件

Lou*_*ier 4 orchardcms

我已经接管了Orchard中List的渲染,以便能够创建自定义标记(我需要在列表的实际内容之前创建交互式导航).这是我目前正在使用的代码:

@using Orchard.DisplayManagement.Shapes;

@{
    var list = Model.List;
    var items = list.Items;
    var count = items.Count;
    var listTag = Tag(list, "ul");
    listTag.AddCssClass("historia");
    var index = 0;
}

<div class="produtos">
    @foreach (var item in items)
    {
        var itemTag = Tag(item, "div");
        itemTag.AddCssClass("item-" + index);
        @itemTag.StartElement;
        <h3>
        @item.Title
        </h3>
        <p>@item.MyCustomTextField</p>
        @itemTag.EndElement;
        ++index;
    }
</div>

@Display(Model.List)

@Display(Model.Pager)
Run Code Online (Sandbox Code Playgroud)

它几乎可以工作......我无法访问列表项字段...我想获取标题并将其放入h3中,然后在其后的段落中放置一个自定义文本字段...我将使用CSS正确渲染此导航部件.在这个导航部分之后,我将调用标准列表渲染例程.

问题是@ item.Title产生一个null /空字符串.我想访问项目内容(没有双关语),其中包括一个自定义文本字段,该字段是将在"导航窗格"中显示的整个帖子的摘录.

Bertrand告诉我们如何使用博客文章来做到这一点:

@using Orchard.ContentManagement;
@{
    IEnumerable<object> blogPosts =
        Model.ContentItems.ContentItems;
}
@if (blogPosts == null || blogPosts.Count() < 1) {
<p>@T("No posts.")</p>
}
else {
    <ul class="content-items">
    @foreach (dynamic post in blogPosts) {
        string title = post.Title;
        ContentItem item = post.ContentItem;
        <li class="content-item-summary">
            @Html.ItemDisplayLink(title, item)
        </li>
    }
    </ul>
}
Run Code Online (Sandbox Code Playgroud)

但它与标准列表的工作方式不同.

(另一个小问题:可以/我应该使用自定义包装器而不是覆盖此列表的整个布局吗?)

Ber*_*Roy 5

博客示例非常不同.对于列表,Items中的内容是形状,而不是内容项.现在,这些形状通常(但不总是)具有对相应内容项的引用,通常在ContentItem属性下.所以以获得标题为例,item.ContentItem.TitlePart.Title会给你你想要的东西.

至于你的包装问题,我不知道你要做什么,所以我不能给出建议.如果你想保持列表渲染不变,但是用额外的标记包围它,那么是的,这是一种方法.