Orchard: module开发基础技术知识

简介:

 在Orchard:如何生成Hello World模块Orchard:使用VS2010来生成一个地图Content PartOrchard:生成一个Content Part中介绍了如何生成Orchard的module,本篇简要介绍一下Orchard的展现流程以及之前介绍的一些handler、drvier之类的对象。

Orchard rendering work

生成content part需要增加的一些对象

  • A content part itself
  • A content part record
  • A handler
  • A driver
  • Display shapes (.cshtml Razor view files)
  • Data migration

A content part

这是一个继承ContentPart 或 ContentPart<T> (T表示对应的record类型) 的普通类。如果不需要保持在数据库,则使用ContentPart,如果希望把数据存储在数据库中,则使用ContentPart<T> 


  
  
public class MapPart : ContentPart < MapRecord >
{
[Required]
public double Latitude
{
get { return Record.Latitude; }
set { Record.Latitude = value; }
}

[Required]
public double Longitude
{
get { return Record.Longitude; }
set { Record.Longitude = value; }
}
}


 

A content part record

这是一个简单的POCO实体对象,这个对象代表part的数据。Orchard负责从底层数据库中获取和更新数据,所以这里除了定义你的record之外不用做任何其他事情。

 


  
  
public class MapRecord : ContentPartRecord
{
public virtual double Latitude { get ; set ; }
public virtual double Longitude { get ; set ; }
}


 

 

A handler

Handler继承自ContentHandler,负责告诉Orchard如何处理你的part:

  • 数据库持久化
  • 处理content item的生命周期事件
  • 定义你的part要添加哪些已存在的content items

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

A driver

可以把Driver当做是一个content part的controller (MVC术语)。它负责显示和编辑你的part。Drivers必须继承自ContentPartDriver<T>, T是你的content part类型。这里有3个方法可以重载:Display 和两个Editor

  • Display method is called whenever your part is rendered in frontend.
  • Editor方法:一个用来展现编辑窗口 (GET),一个用来展现保存窗口 (POST)。当你开始生成一个content item(例如一个新page)时调用第一个方法,当点击"Save"时触发第二个方法。

类似与MVC的controller actions,这里的方法返回一个shape对象。Shapes通过参数中的动态对象方法去找.cshtml,例如如果我们在/Views/Parts目录下存在MyModule.MyPart.cshtml文件,则通过动态方法shapeHelper.Parts_MyModule_MyPart(…)来访问

 


  
  
public class MapDriver : ContentPartDriver < MapPart >
{
protected override DriverResult Display(
MapPart part,
string displayType, dynamic shapeHelper)
{

return ContentShape( " Parts_Map " , () => shapeHelper.Parts_Map(
Longitude: part.Longitude,
Latitude: part.Latitude));
}

// GET
protected override DriverResult Editor(
MapPart part, dynamic shapeHelper)
{

return ContentShape( " Parts_Map_Edit " ,
()
=> shapeHelper.EditorTemplate(
TemplateName:
" Parts/Map " ,
Model: part,
Prefix: Prefix));
}
// POST
protected override DriverResult Editor(
MapPart part, IUpdateModel updater, dynamic shapeHelper)
{

updater.TryUpdateModel(part, Prefix,
null , null );
return Editor(part, shapeHelper);
}
}


 

 

Display shapes

这里就是Razor视图.cshtml文件,按照命名约定,显示用的模板存在于/Views/Parts 目录下,返回Editor driver方法时的模板存在于/Views/EditorTemplates/Parts目录下。

 


  
  
< img alt = " Location " border = " 1 " src = " http://maps.google.com/maps/api/staticmap?
& zoom = 12
& size = 50 0x500
& maptype = roadmap
& markers = color:blue | @Model.Latitude,@Model.Longitude
& sensor = false " />


 

 

Data migration

这是定义数据库的地方。一般我们通过在Orchard命令行输入codegen datamigration <your_module_name> 来生成目录。这里还可以更改一些设置等。


  
  
public class Migrations : DataMigrationImpl
{

public int Create()
{
// Creating table MapRecord
SchemaBuilder.CreateTable( " MapRecord " , table => table
.ContentPartRecord()
.Column(
" Latitude " , DbType.Double)
.Column(
" Longitude " , DbType.Double)
);

ContentDefinitionManager.AlterPartDefinition(
typeof (MapPart).Name, cfg => cfg.Attachable());

return 1 ;
}
}
 本文转自 陈本峰 51CTO博客,原文链接:http://blog.51cto.com/zhoujg/516669,如需转载请自行联系原作者
相关文章
|
2月前
|
JSON API 数据格式
深度剖析!Python Web 开发中 RESTful API 的每一个细节,你不可不知的秘密!
在 Python Web 开发中,RESTful API 是构建强大应用的关键,基于 Representational State Transfer 架构风格,利用 HTTP 卞性能。通过 GET、POST、PUT 和 DELETE 方法分别实现资源的读取、创建、更新和删除操作。示例代码展示了如何使用 Flask 路由处理这些请求,并强调了状态码的正确使用,如 200 表示成功,404 表示未找到资源等。
49 5
|
3月前
|
JavaScript 前端开发 测试技术
Angular与NestJS的神奇之处:如何用全栈技术让你的项目一鸣惊人?
【8月更文挑战第31天】在现代软件开发中,全栈开发已成为主流。借助Google支持的开源前端框架Angular及基于TypeScript的Node.js框架NestJS,我们可以构建出高性能的全栈应用。本文将探讨Angular与NestJS的结合方式,并通过示例代码展示如何创建全栈Angular应用。了解应用需求、编写测试和关注性能是实现这一目标的关键步骤。随着Angular和NestJS生态的不断发展,它们必将在未来的Web开发中发挥更大的作用。
85 0
|
6月前
|
前端开发 JavaScript 开发者
【专栏】前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup
【4月更文挑战第27天】本文探讨了前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup。Webpack以其灵活性和插件系统适用于复杂SPA项目,建议开发者理解其核心概念并优化性能。Rollup则专注于JavaScript模块打包,生成更小、更快的代码,适合小型至中型项目和库创建,以其Tree-shaking技术减小代码体积。开发者应根据项目需求、团队技术和生态选择合适工具,掌握核心原理以提升开发效率和质量。
68 1
|
6月前
|
资源调度 前端开发 JavaScript
vue - ES6模块化、promise、webpack打包(所在在学的朋友们先看这篇,看了不吃亏)...
vue - ES6模块化、promise、webpack打包(所在在学的朋友们先看这篇,看了不吃亏)...
|
缓存
webpack原理篇(六十一):更复杂的 loader 的开发场
webpack原理篇(六十一):更复杂的 loader 的开发场
129 1
webpack原理篇(六十一):更复杂的 loader 的开发场
|
缓存 API
小满nestjs(第七章 RESTful 风格设计)
RESTful 是一种风格,在RESTful中,一切都被认为是资源,每个资源有对应的URL标识. 不是标准也不是协议,只是一种风格。当然你也可以不按照他的风格去写。
131 0
小满nestjs(第七章 RESTful 风格设计)
webpack原理篇(六十四):更复杂的插件开发场景
webpack原理篇(六十四):更复杂的插件开发场景
128 0
学习笔记jira项目11-为什么我们要学ts
学习笔记jira项目11-为什么我们要学ts
76 0
学习笔记jira项目11-为什么我们要学ts
|
缓存 监控 前端开发
了不起的 Webpack HMR 学习指南(含源码分析) 下
了不起的 Webpack HMR 学习指南(含源码分析) 下
222 0
|
JavaScript 前端开发 编译器
了不起的 Webpack HMR 学习指南(含源码分析) 上
了不起的 Webpack HMR 学习指南(含源码分析) 上
330 0