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



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

@使用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)

它几乎奏效了。。。我无法访问列表项字段。。。我想获取标题并将其放入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>
}

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

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

博客示例非常不同。在列表的情况下,"项目"中包含的是形状,而不是内容项目。现在,这些形状通常(但并不总是)具有对相应内容项的引用,通常位于ContentItem属性下。例如,为了获得标题,item.ContentItem.TitlePart.Title会给你想要的。

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

最新更新