在Orchard中创建一个HelloWorld模块

时间:2022-09-21 13:25:05
    学习Orchard近两个星期了,虽然对很多概念还是比较模糊。但是,在Orchard官网中看到了一篇介绍创建Hello World模块的文章,还是迫不及待的先照着体验了一把Orchard的模块开发。(小经验:学习开源框架不能光看不动手,边学边实践学起来会更快些。)
 

原文地址:http://www.orchardproject.net/docs/Building-a-hello-world-module.ashx

(以下内容并不完全是按照原文翻译而来,本文示例基于Orchard v1.1)
 

目标

创建一个仅在页面上显示Hello World 字样的模块。可以在浏览器中输入:http://localhost/HelloWord 来访问这个页面。
 

介绍

Orchard是建立在ASP.NET MVC框架上的,Orchard中的模块相当于MVC 中的Areas。MVC是一种系统划分的设计模式,它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。M是数据,C是控制器负责处理用户交互,操作模型和最终选择用哪个视图来显示UI,V是视图仅用来呈现数据。

 

原文例子中并没有将需要显示的文字作为Model传递到View上,而是直接将“HelloWorld”的文字直接写在了View上。所以原文并不关心Model这一块,其实我们也可以把需要显示的文字当中Model来处理。

 

根据本例的需求,我们就需要建立一个路由,让系统知道当有一个http://localhost/HelloWord 请求的时候需要执行那个Controller的那个action。当然我们也需要创建这个Controller,并实现相应action的把“HelloWorld”文字传递到View上的功能。同时我们也需要建立一个对应的View,来显示Controller传递过来的Model。
 

自动生成模块代码结构

可以通过Orchard中一个Code Generation的功能来自动创建模块代码结构。Code Generationd的详细介绍可以参见《 Command-Line Code Generation》或《 Orchard中的命令行工具》。

 

安装并启用Code Generation后,在Orchard命令行工具中输入:

codegen module MyCompany.HelloWorld

 

注:在Orchard中创建模块的时候最好采用“公司名+功能名”的方式来作为模块的命名。这样可以在以后发布模块的时候,不和其他公司开发的相似功能的模块相冲突。

 

模块创建成功后,可以在Orchard的Module目录中看见我们刚创建的模块项目。

在Orchard中创建一个HelloWorld模块 

 

修改模块清单文件

在新创建的模块目录中可以发现一个Module.txt文件,这是一个模块清单文件。他描述了这个模块的一些基本信息,如:名称,作者,版本等。这些信息将会在系统中显示,告诉管理员这个模块的作用和其他一些相关的信息。

 

在Orchard中创建一个HelloWorld模块在Orchard中创建一个HelloWorld模块Module.txt
Name: MyCompany.HelloWorld
AntiForgery: enabled
Author: 二十四画生
Website: http://esshs.cnblogs.com/
Version: 1.0
OrchardVersion: 1.0
Description: 这是一个简单显示HelloWorld字样的模块
Features:
    MyCompany.HelloWorld:
        Description: 这是一个简单显示HelloWorld字样的模块

 

注:如果此文件中包含中文,需要将该文件保存为Utf-8编码格式。

 

添加路由

在模块根目录中添加一个Routes.cs文件,定义Url和Controller间的对应关系。由于没有相应代码生成命令,所以只能是手工输入以下代码。 
在Orchard中创建一个HelloWorld模块在Orchard中创建一个HelloWorld模块Routes.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  Orchard.Mvc.Routes;
using  System.Web.Routing;
using  System.Web.Mvc;

namespace  MyCompany.HelloWorld
{
    
///   <summary>
    
///  定义模块所用到的路由,在Orchard中定义路由需要实现IRouteProvider接口
    
///   </summary>
     public   class  Routes : IRouteProvider
    {
        
#region  IRouteProvider 成员

        
public  IEnumerable < RouteDescriptor >  GetRoutes()
        {
            
return   new [] 
            {
                
new  RouteDescriptor 
                {                    
                    Priority 
=   5 ,                            // 优先级(作用暂不清楚,留着以后研究)
                    Route  =   new  Route
                    (
                        
" HelloWorld " ,                        // 路由的 URL 模式。
                         new  RouteValueDictionary             // 要在 URL 不包含所有参数时使用的值。默认执行HomeController中Index action。
                        {
                            {
" area " " MyCompany.HelloWorld " },
                            {
" controller " " Home " },
                            {
" action " " Index " }
                        },
                        
new  RouteValueDictionary(),          // 一个用于指定 URL 参数的有效值的正则表达式。
                         new  RouteValueDictionary {{ " area " " MyCompany.HelloWorld " }},     // 传递到路由处理程序但未用于确定该路由是否匹配特定 URL 模式的自定义值。这些值会传递到路由处理程序,以便用于处理请求。
                         new  MvcRouteHandler()        // 处理路由请求的对象。
                    )
                }
            };
        }

        
public   void  GetRoutes(ICollection < RouteDescriptor >  routes)
        {
            
foreach  (var routeDescriptor  in  GetRoutes())
            {
                routes.Add(routeDescriptor);
            }
        }

        
#endregion
    }

 

创建控制器(Controller)

可以在Orchard命令行中输入:
codegen controller MyCompany.HelloWorld HomeController
创建成功后,在模块Controllers目录下会多出一个HomeController.cs文件。打开此文件将代码修改如下: 

在Orchard中创建一个HelloWorld模块在Orchard中创建一个HelloWorld模块HomeController.cs
using  System.Web.Mvc;
using  Orchard.Localization;
using  Orchard;
using  Orchard.Themes;

namespace  MyCompany.HelloWorld.Controllers 
{
    
///   <summary>
    
///  需要加一个Themed的属性,否则所呈现的内容不会在Orchard的皮肤中显示
    
///   </summary>
    [Themed]
    
public   class  HomeController : Controller 
    {
        
///   <summary>
        
///  对应Route中默认执行的那个Index action
        
///   </summary>
        
///   <returns></returns>
         public  ActionResult Index()
        {
            
string  model  =   " Hello World! " ;   // 这个是Model,现在是直接写在Code中的。当然可以在从数据库中取
             return  View(( object )model);      // 默认使用Views\Home目录下的Index试图
        }
    }

 

创建视图(View)

在模块的Views目录中创建一个Home的目录(对应Controller),并在此目录中创建一个Index.cshtml文件(对应action)。输入以下代码: 
在Orchard中创建一个HelloWorld模块在Orchard中创建一个HelloWorld模块Index.cshtml
<!-- 呈现Controller传递过来的数据 -->
< h2 > @this.Model </ h2

 

注:Orchard中使用的试图引擎是Razor。

 

启用模块

可以在Orchard命令行中输入以下命令来启动模块:
feature enable MyCompany.HelloWorld
当然我们也可以登录后台,在:/Admin/Modules/Features中启用

在Orchard中创建一个HelloWorld模块 

 

使用模块

直接在浏览器中输入Orchard网站地址/HelloWorld,如:http://localhost/HelloWorld,就可以访问到我们创建的模块了。

在Orchard中创建一个HelloWorld模块

 

结论

在这边文章里面,我创建了一个非常简单的模块。它通过HomeController中的Index action处理了一个/HelloWorld的Url请求,在页面上显示了Hello World! 的文字。模块的功能虽然简单,但是也涵盖了创建模块启用模块的基本操作和模块作为一个MVC Area运行的基本概念。为后续深入学习Orchard模块开发奠定了基础。
 

本文示例的下载:点击这里

 

参考文档:

Orchard代码生成工具的使用: http://orchardproject.net/docs/Command-line-scaffolding.ashx