请注意,本站并不支持低于IE8的浏览器,为了获得最佳效果,请下载最新的浏览器,推荐下载 Chrome浏览器
欢迎光临。交流群:166852192

理解内容处理程序(Handlers)


处理程序(Content handler)定义了当部件(part)有事件发生时响应特定的事件。比如当一个部件part激活时。处理程序使你在内容项生命周期的特定时候执行动作,也使你建立数据存储和优先操作数据模型(data model)呈现内容项(content item)。
通常,通过继承ContentHandler类来为内容部件定义handler。ContentHandler是基类提供的方法和属性当定义你自己的处理程序时通常会需要,另一种定义自己的内容处理程序的方法是创建实现IContentHandler接口的类。


定义数据存储库和添加过滤器

添加一个构造函数来处理程序接收内容部件持久数据 ,关于handler添加接受IRepository参数类型的在part中你为record定义的对象的构造器。下面代码展示了content handler的基本的实现,MapRecord是在不同文件中定义的类。
using Map.Models;using Orchard.ContentManagement.Handlers;using Orchard.Data;namespace Map.Handlers {    public class MapHandler : ContentHandler {        public MapHandler(IRepository<MapRecord> repository) {            Filters.Add(StorageFilter.For(repository));        }    }}

这个StorageFilter类负责持久化数据从存储库对象数据库。
你可以添加其他类型的过滤器的内容处理程序。例如,您可以添加一个ActivatingFilter给过滤器集合定义如何部件怎么添加到一个类型(type)中。

生命周期事件

除了定义库(repository),你可以添加事件处理代码。 您可以使用下面的方法来添加事件执行的代码:
  • OnActivated
  • OnCreated
  • OnCreating
  • OnIndexed
  • OnIndexing
  • OnInitializing
  • OnLoaded
  • OnLoading
  • OnPublished
  • OnPublishing
  • OnRemoved
  • OnRemoving
  • OnUnpublished
  • OnUnpublishing
  • OnVersioned
  • OnVersioning
例如, TagPartHandler类包含的代码Removed和Indexing事件采取的行动,如在下面的例子所示:
public class TagsPartHandler : ContentHandler {    public TagsPartHandler(IRepository<TagsPartRecord> repository, ITagService tagService) {        Filters.Add(StorageFilter.For(repository));        OnRemoved<TagsPart>((context, tags) =>             tagService.RemoveTagsForContentItem(context.ContentItem));        OnIndexing<TagsPart>((context, tagsPart) =>             context.DocumentIndex.Add(tags, String.Join(, , tagsPart.CurrentTags.Select(t => t.TagName))).Analyze());    }}

数据处理

你能重写下面的方法执行与数据的状态关联actions。

  • GetItemMetadata
  • BuildDisplayShape
  • BuildEditorShape
  • UpdateEditorShape
例如:BlogPostPartHandler类重写了GetItemMetadata方法,使用像下面的代码添加路由值:
protected override void GetItemMetadata(GetContentItemMetadataContext context) {    var blogPost = context.ContentItem.As<BlogPostPart>();     if (blogPost == null)        return;     context.Metadata.CreateRouteValues = new RouteValueDictionary {        {Area, Orchard.Blogs},        {Controller, BlogPostAdmin},        {Action, Create},        {blogId, blogPost.BlogPart.Id}    };    context.Metadata.EditorRouteValues = new RouteValueDictionary {        {Area, Orchard.Blogs},        {Controller, BlogPostAdmin},        {Action, Edit},        {postId, context.ContentItem.Id},        {blogId, blogPost.BlogPart.Id}    };    context.Metadata.RemoveRouteValues = new RouteValueDictionary {        {Area, Orchard.Blogs},        {Controller, BlogPostAdmin},        {Action, Delete},        {postId, context.ContentItem.Id},        {blogSlug, blogPost.BlogPart.As<RoutePart>().Slug}    };}

参考文档:http://docs.orchardproject.net/Documentation/Understanding-content-handlers


作者原创内容不容易,如果觉得内容不错,请点击右侧“打赏”,赏俩给作者花花,也算是对作者付出的肯定,也可以鼓励作者原创更多更好内容。
更多详情欢迎到QQ群 166852192 交流。