Orchard CMS:以编程方式获取自定义内容部分的元素

本文关键字:容部 元素 自定义 获取 CMS 编程 方式 Orchard | 更新日期: 2023-09-27 17:56:49

我正在为Orchard CMS创建模块 - 自定义内容类型元素的查看器小部件。

所以,我有服务接口:

public interface IReviewGrabber : IDependency 
{
    IEnumerable<ReviewPart> Reviews { get; }
}

它的实现:

public class ReviewGrabber : IReviewGrabber
{
    readonly IOrchardServices _orchardServices;
    readonly IEnumerable<ReviewPart> _reviews;
    public ReviewGrabber(IOrchardServices orchardServices)
    {
        _orchardServices = orchardServices;
        var temp = _orchardServices.ContentManager.Query<ReviewPart, ReviewRecord>();
        _reviews = temp.List();
    }
    public IEnumerable<ReviewPart> Reviews
    {
        get { return _reviews; }
    }
}

和内容类型的处理程序:

public class ReviewHandler : ContentHandler
{
    public ReviewHandler(IRepository<ReviewRecord> repository)
    {
        Filters.Add(StorageFilter.For(repository));
    }
}

调试这个,我手动添加了 Review 类型的元素,它可以工作。在类变量ReviewGrabbertemp正确填充,但为其调用方法List()会触发错误:

ValueFactory 尝试访问此实例的 Value 属性。

_处理器。值'_handlers。Value' 抛出了一个类型为 'System.InvalidOperationException' System.Collections.Generic.IEnumerable {System.InvalidOperationException} 的异常

在行上

public IEnumerable<IContentHandler> Handlers {
     get { return _handlers.Value; }
}

DefaultContentManager.cs

怎么了?谢谢!

Orchard CMS:以编程方式获取自定义内容部分的元素

对于初学者来说,在构造函数中进行查询是一个很大的禁忌。构造函数应该只做一些琐碎的工作,例如初始化变量,而不是查询数据库。

同样,属性获取者通常不应该做很多工作。您应该使用一种方法 GetReviews,该方法根据需要执行查询。如有必要,可以在以后添加缓存。