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

时间:2014-04-06 08:52:36

标签: c# asp.net razor orchardcms

我正在为Orchard CMS创建模块 - 查看器小部件,用于自定义ContentType的元素。

所以,我有服务接口:

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; }
    }
}

ContentType的处理程序:

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

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

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

_handlers.Value'_handlers.Value'抛出类型'System.InvalidOperationException'的异常'System.Collections.Generic.IEnumerable {System.InvalidOperationException}

在行

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

中的

怎么了?谢谢!

1 个答案:

答案 0 :(得分:2)

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

同样,物业瘾君子通常不会做很多工作。您应该使用GetReviews方法,根据需要进行查询。如有必要,可以在以后添加缓存。

相关问题