博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
六、Working with Data(二) Understanding Content Handlers
阅读量:4957 次
发布时间:2019-06-12

本文共 2883 字,大约阅读时间需要 9 分钟。

Content handler定义了当content part有事件发生时响应特定的事件。比如当一个part激活时。content handler使你在content item生命周期的特定时候执行actions,也使你建立数据存储和优先操作data model呈现content item。

通常,通过继承ContentHandler类来为content part定义handler。ContentHandler是基类提供的方法和属性当定义你自己的content handler时通常会需要,另一种定义自己的content handler的方法是创建实现IContentHandler接口的类。

 

Defining Data Repository and Adding Filters

当用持久化数据的content part工作 ,关于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
repository) { Filters.Add(StorageFilter.For(repository)); } }}

StorageFilter 类负责从repository objectg到数据库持久化。你能为content handler添加其它类型的filters。例如:你能添加一个ActivatingFilter到Filters集合来定义part怎样添加到一个type中。

 

Lifecycle Events

除了定义repository,你能为handing events添加代码,使用下面的方法添加的代码为event执行。

  • 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
repository, ITagService tagService) { Filters.Add(StorageFilter.For(repository)); OnRemoved
((context, tags) => tagService.RemoveTagsForContentItem(context.ContentItem)); OnIndexing
((context, tagsPart) => context.DocumentIndex.Add("tags", String.Join(", ", tagsPart.CurrentTags.Select(t => t.TagName))).Analyze()); }}

 

Data Manipulation

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

  • GetItemMetadata
  • BuildDisplayShape
  • BuildEditorShape
  • UpdateEditorShape

例如:BlogPostPartHandler类重写了GetItemMetadata方法,使用像下面的代码添加路由值:

protected override void GetItemMetadata(GetContentItemMetadataContext context) {    var blogPost = context.ContentItem.As
(); 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
().Slug} };}

转载于:https://www.cnblogs.com/ibrady/archive/2012/03/22/2412434.html

你可能感兴趣的文章
java反射机制剖析(二)— Class Loader
查看>>
走进C++程序世界------异常处理
查看>>
通过用户模型,对数据库进行增删改查操作。
查看>>
去除数组中重复的元素
查看>>
Nginx配置文件nginx.conf中文详解(转)
查看>>
POJ 1988 Cube Stacking
查看>>
POJ 1308 Is It A Tree?(并查集)
查看>>
N进制到M进制的转换问题
查看>>
Android------三种监听OnTouchListener、OnLongClickListener同时实现即其中返回值true或者false的含义...
查看>>
MATLAB实现多元线性回归预测
查看>>
Mac xcode 配置OpenGL
查看>>
利用sed把一行的文本文件改成每句一行
查看>>
使用Asyncio的Coroutine来实现一个有限状态机
查看>>
Android应用开发:核心技术解析与最佳实践pdf
查看>>
python——爬虫
查看>>
2.2 标识符
查看>>
孤荷凌寒自学python第五天初识python的列表
查看>>
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
查看>>
求一个字符串中最长回文子串的长度(承接上一个题目)
查看>>
简单权限管理系统原理浅析
查看>>