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 类型的元素,它可以工作。在类变量ReviewGrabber
中temp
正确填充,但为其调用方法List()
会触发错误:
ValueFactory 尝试访问此实例的 Value 属性。
_处理器。值'_handlers。Value' 抛出了一个类型为 'System.InvalidOperationException' System.Collections.Generic.IEnumerable {System.InvalidOperationException} 的异常
在行上
public IEnumerable<IContentHandler> Handlers {
get { return _handlers.Value; }
}
在DefaultContentManager.cs
怎么了?谢谢!
对于初学者来说,在构造函数中进行查询是一个很大的禁忌。构造函数应该只做一些琐碎的工作,例如初始化变量,而不是查询数据库。
同样,属性获取者通常不应该做很多工作。您应该使用一种方法 GetReviews,该方法根据需要执行查询。如有必要,可以在以后添加缓存。