二十四画生的Blog


        ——开始学习Orchard框架
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在Orchard中创建一个HelloWorld模块

Posted on 2011-06-11 12:38  二十四画生  阅读(7780)  评论(6编辑  收藏  举报
    学习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目录中看见我们刚创建的模块项目。

 

 

修改模块清单文件

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

 

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间的对应关系。由于没有相应代码生成命令,所以只能是手工输入以下代码。 
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文件。打开此文件将代码修改如下: 

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)。输入以下代码: 
Index.cshtml
<!--呈现Controller传递过来的数据-->
<h2>@this.Model</h2

 

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

 

启用模块

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

 

 

使用模块

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


 

结论

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

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

 

参考文档: