Orchard:如何生成Hello World模块
在Orchard架构介绍中对Orchard的一些架构内容进行了介绍,下图是Orchard自带的一些模块,
本篇讲解一下如何扩展Orchard来生成我们的第一个模块。
介绍
Orchard构建在ASP.NET MVC之上,MVC是一个应用模式,我在信息系统开发平台OpenExpressApp - Command扩展机制简单介绍了一下。在本篇示例中不包含任何数据,所以我们暂时不用关心model。我们只需要一个controller 和一个view。
在Orchard中Modules能够打包成一个可重用的资产,Modules被实现成一个MVC Areas。在MVC中Areas是一个包含一套独立于其他站点的功能的子站点(sub-sites)。
生成模块目录结构
在生成我们要做的模块示例的文件结构,我们需要先在Orchard的控制台中下载、安装和打开Code Generation 功能,不知道如何下载安装的看看我之前的几篇文档。对于命令行代码生成器的更多内容可以查看Command-line Code Generation.
一旦我们打开了代码生成功能,我们打开Orchard command-line,打上下面的命令来生成HelloWorld模块:
执行命令后,在Orchard网站的Modules目录下可以看到一个新的HelloWorld目录,在这个目录下可以找到文件module.txt ,按以下内容修改:
antiforgery: enabled
author: The Orchard Team
website: http://orchardproject.net
version: 0.5.0
orchardversion: 0.5.0
description: The Hello World module is greeting the world and not doing much more.
features:
HelloWorld:
Description: A very simple module.
Category: Sample
这个文件描述当前模块,在功能管理面板可以看到这个信息
注意:使用空格,而不是tab缩进
添加Route
示例将处理网站的相对地址/HelloWorld 。为了定义请求这个URL是要做什么,我们需要在HelloWorld目录下生成文件Routes.cs:
using System.Web.Mvc;
using System.Web.Routing;
using Orchard.Mvc.Routes;
namespace HelloWorld {
public class Routes : IRouteProvider {
public void GetRoutes(ICollection<RouteDescriptor> routes) {
foreach (var routeDescriptor in GetRoutes())
routes.Add(routeDescriptor);
}
public IEnumerable<RouteDescriptor> GetRoutes() {
return new[] {
new RouteDescriptor {
Priority = 5,
Route = new Route(
"HelloWorld",
new RouteValueDictionary {
{"area", "HelloWorld"},
{"controller", "Home"},
{"action", "Index"}
},
new RouteValueDictionary(),
new RouteValueDictionary {
{"area", "HelloWorld"}
},
new MvcRouteHandler())
}
};
}
}
}
一个Route是一个在URL和controller之间的映射,上面的代码是映射/HelloWorld URL到area HelloWorld 的Home controller的Index action
生成Controller
新的模块已经有一个Controllers 目录,下面需要生成HomeController.cs:
using Orchard.Themes;
namespace HelloWorld.Controllers {
[Themed]
public class HomeController : Controller {
public ActionResult Index() {
return View("HelloWorld");
}
}
}
这个controller处理URL /HelloWorld的请求。在定义Route时我们设置了默认为index的action,代码中Index方法返回HelloWorld视图。
注意在HomeController上的Themed 属性在视图在当前主题下获取皮肤时需要用到。
生成View
在Views目录下,生成一个Home的目录Views\Home,然后添加一个视图文件HelloWorld.cshtml:
注意使用T helper function是希望视图将来支持本地化,这虽然不是强制的,但是是一个好的实践。
添加新的文件到项目中去
上面工作做完之后,剩下的任务就是把这些文件加入HelloWorld.csproj项目文件中进行动态编译了。打开HelloWorld.csproj文件进行编辑:
<Compile Include="Routes.cs"/>
<Compile Include="Controllers\HomeController.cs"/>
</ItemGroup>
<Content Include="Views\HelloWorld.cshtml" />
激活模块
最后我们需要激活刚加的模块,在命令行下输入以下命令:
我们也可以在后台的【Features】中打开
使用Module
我们可以在网站地址之后添加URL /HelloWorld,显示如下界面:
参考: Building a Hello World module
推荐:你可能需要的在线电子书
我的新浪围脖: http://t.sina.com.cn/openexpressapp
欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]
更改清单文件 Manifest
Orchard:如何生成Hello World模块相关推荐
- boost python导出c++ map_使用Boost生成的Python模块:与C++签名不匹配
我正在使用名为Mitsuba的软件.它附带了一个用Boost包装的Python实现. Python中的这一行:使用Boost生成的Python模块:与C++签名不匹配 scene = SceneHan ...
- 生成下面的模块时,启用了优化或没有调试信息
生成下面的模块时,启用了优化或没有调试信息: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\...\xxx ...
- APIcoud 手机二维码or条码 生成与扫描模块
APIcoud 手机二维码or条码 生成与扫描模块 刚接触APIcoud 的时候觉得很多模块真的好难,初次接触二维码的时候觉得,生成二维码真的很费劲呢,其实不然,是真的很难,但是APIcoud 已经封 ...
- python生成随机数—random模块
random 模块包括返回随机数的函数,可以用于模拟或者任何产生随机输出的程序. random.random() 返回随机生成的一个实数,它在[0,1)范围内 random.randint(a, ...
- Python02 标准输入输出、数据类型、变量、随记数的生成、turtle模块详解
1 标准输出 python3利用 print() 来实现标准输出 def print(self, *args, sep=' ', end='\n', file=None): # known speci ...
- Orchard之生成新模板
一:启用 Code Generation 进入后台, Modules –> Developer Enable 之. 二:生成模版 首先,进入 Orchard 命令行 在 CMD 下到达解决方案 ...
- 在Orchard中使用Image Gallery模块
作为ASP.NET MVC领域一款优秀的开源CMS,Orchard值得所有.NET Web开发人员学习和研究,然后二次开发,最后在其基础上创新.也是遵循国内人员学习IT技术的路线:引进->吸收- ...
- Unity 自动化1.0(代码,预制体生成到指定模块)
代码生成参考的 知乎[Unity]工具类系列教程-- 代码自动化生成! - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/30716595 操作流程: 一,创建 ...
- python用turtle输入数字_Python02 标准输入输出、数据类型、变量、随记数的生成、turtle模块详解...
1 标准输出 python3利用print() 来实现标准输出 def print(self, *args, sep=' ', end='\n', file=None): #known special ...
最新文章
- 使用Fair kripke来判断kripke的可达性和可避免性
- C语言经典例14-将一个正整数分解质因数
- Faster RCNN网络简介
- 工程实战-ES6环境配置
- 关于Linq to DataSet
- 谷歌大神Jeff Dean领衔,万字展望5大AI趋势
- 需要编写支持英特尔 x86 的 Android* 游戏应用? 此处的样本可为您提供帮助!
- 计算机代码大全喜欢你,微信示爱代码大全 七夕情人节微信翻译表白代码2021
- json类型大小 mysql_MySQL数据类型 - JSON数据类型 (1)
- 160个破解练习之CrackMe 006
- Shufflenet解读
- 计算机网络——集线器与交换机
- 使用Netflix Archaius进行配置管理
- 【MM采购定价】怎么样实现创建采购订单的时候,采购价格不可以更改?
- 多层板的板层布局和线宽的设置(记录)
- WiFi广告路由器的利与弊
- zte android截屏快捷键,中兴红牛V5手机怎么截屏 中兴红牛V5截图技巧图解
- HTML设置网站标题前的logo
- Dell 灵越7370 装机过程遇到硬盘枷锁 bitlocker锁解决方法
- FF新推荐弹窗怎么彻底让他爬
热门文章
- 关于object references an unsaved transient instance - save the transient instance before flushing的解决方法
- python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python
- 【二级java】操作题知识点积累
- 第8章系统服务(简易音频播放器的实现)
- Java开发买低压本还是标压本_标压和低压,笔记本怎么选才最香?
- python银行家算法代码_避免死锁的银行家算法C++程序实现
- 【Ant Design Pro 四】react 点击事件传参
- APP程序内部打开某个APP的AppStore页面
- Memcached, Redis, MongoDB区别
- 图解c/c++多级指针与“多维”数组