基于另一个模块字段的Orchard筛选投影查询

3
在Orchard 1.6上,我定义了一个自定义内容类型Offer,该Offer具有Pack字段。在显示一个Offer的页面上,我想显示与相同Pack的其他Offer的简短列表。
为了实现这一点,我尝试制作一个投影,但如何在查询过滤器中指定Pack字段必须等于当前显示的Offer的Pack字段呢?
谢谢。
2个回答

2
您可以编写一个内容处理程序,以在请求中稍后使用时存储当前显示的内容项:
public class MyContentHandler : ContentHandler
{
    readonly IOrchardServices orchardServices;

    public MyContentHandler (
        IOrchardServices orchardServices)
    {
        this.orchardServices = orchardServices;            
    }

    protected override void BuildDisplayShape(BuildDisplayContext context)
    {
        if (context.DisplayType == "Detail" && ((IShape)context.Shape).Metadata.Type == "Content" &&
            orchardServices.WorkContext.GetState<ContentItem>("currentContentItem") == null)
        {
            orchardServices.WorkContext.SetState("currentContentItem", context.ContentItem);
        }
    }
}

接下来,您可以使用存储在状态中的内容项引用编写投影筛选器。(参见Orchard.Tags.Projections.TagsFilter作为编写投影筛选器的示例。)


这个解决方案只有在内容实际显示后(显示形状被创建)才能起作用。您无法更早地以这种方式获取当前项目。 - Piotr Szmyd
您可以在视图中使用以下代码:var item = WorkContext.GetState<ContentItem>("CurrentContentItem"); - Hazza

0

我不相信目前可以实现这个。恐怕您必须编写自己的代码来完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接