Orchard入门:如何创建一个完整Module

这是一个Orchard-Modules的入门教程。在这个教程里,我们将开发两个功能页面分别用于数据录入与数据展示。

完成上述简单功能开发,我们一共需要6个步骤。分别为:

  • 创建Module
  • 创建Model
  • 创建Services
  • 创建Controller、View
  • 创建Route
  • 创建Admin Menu

上面6个步骤可能不太好理解。在这里,我们把他们转换从MVC中的概念让我们更好理解。


Module


项目模块


Model


实体层


Controller、View


Controller、View


Route


Route


Services


服务层


Admin Menu


后台管理

有点概念后,我们就开始吧!

创建Module

第一步我们需要利用Orchard的代码生成工具Code Generation 来生成Module项目文件。如果对这个命令还不是很熟悉,我们可以在这里先进行了解。

创建:


codegen module XiaoGuang.HelloWorld

使用上述就完成了一个HelloWorld Module的创建。

*关于Module的名称,建议使用系统模块.功能名来命名。

修改清单文件Module.txt:

这个文件用于描述Module信息与依赖关系。因为本次只是一个简单示例,不深入讲解。


Name: XiaoGuang.HelloWorld

AntiForgery: enabled

Author: 互联网新手

Website: http://curd.cnblogs.com

Version: 1.0

OrchardVersion: 1.0

Description: XiaoGuang.HelloWorld演示模块。

Features:

XiaoGuang.HelloWorld:

Description: XiaoGuang.HelloWorld演示模块。

启用:

管理后台->Modules->找到[XiaoGuang.HelloWorld]->点击Enable 或 命令行:feature enable XiaoGuang.HelloWorld

不少朋友开发完Module后,输入了注册路由的地址。发现始终无法看到效果。实际上是Module默认为非启用状态导致。

创建Model

Models目录下新增TestRecord.cs 文件。新增,代码如下:


namespace XiaoGuang.HelloWorld.Models

{

public class TestRecord

{

public virtual int Id { get; set; }

public virtual string Content { get; set; }

}

}

注:如果后续运行提示没有持久化的问题。是因为实体类必须放在命名空间为Models或Records结尾下。

这属于Orchard默认规范,详见:https://orchard.codeplex.com/discussions/267968


codegen datamigration XiaoGuang.HelloWorld

上述语句创建一个实体迁移。并生成如下代码,完成Record对应表创建过程。


public class Migrations : DataMigrationImpl {

public int Create() {

// Creating table TestRecord

SchemaBuilder.CreateTable("TestRecord", table => table

.Column("Id", DbType.Int32, column => column.PrimaryKey().Identity())

.Column("Content", DbType.String)

);

return 1;

}

}

创建Services

新建文件:

ITestService:


public interface ITestService :Orchard.IDependency {

TestRecord GetTest();

TestRecord UpdateTest(string content);

}

TestService:


public class TestService : ITestService {

private readonly IRepository<TestRecord> _testRepository;

public TestService(IRepository<TestRecord> testRepository) {

_testRepository = testRepository;

}

public TestRecord GetTest() {

return _testRepository.Table.FirstOrDefault();

}

public TestRecord UpdateTest(string content) {

var result = GetTest();

if (result == null) {

result = new TestRecord {Content = content};

_testRepository.Create(result);

}

else {

result.Content = content;

_testRepository.Update(result);

}

return result;

}

}

上面的代码的重点是IRepository ,由Orchard封装。实现了实体的增、删、改、查功能。

创建Controller、View

Controller:


public class AdminController : Controller {

public IOrchardServices Services { get; set; }

public ITestService TestService { get; set; }

public AdminController(IOrchardServices services, ITestService testService) {

Services = services;

T = NullLocalizer.Instance;

TestService = testService;

}

public Localizer T { get; set; }

public ActionResult Update(string content) {

TestService.UpdateTest(content);

return RedirectToAction("Index", "Home");

}

}

这里充分体现了依赖注入的好处。只需要构造函数传递接口就可以了。框架自动实例。也易于单测。

View:


@model XiaoGuang.HelloWorld.Models.TestRecord

@{

Layout.Title = T("TestUpdate").ToString();

}

@using (Html.BeginFormAntiForgeryPost(Url.Action("Update", "Admin"))) {

@Html.AntiForgeryToken()

<div class="form-horizontal">

@Html.ValidationSummary(true, "", new {@class = "text-danger"})

<div class="form-group">

@Html.LabelFor(model => model.Content, htmlAttributes: new {@class = "control-label col-md-2"})

<div class="col-md-10">

@Html.EditorFor(model => model.Content, new {htmlAttributes = new {@class = "form-control"}})

@Html.ValidationMessageFor(model => model.Content, "", new {@class = "text-danger"})

</div>

</div>

<div class="form-group">

<div class="col-md-offset-2 col-md-10">

<input type="submit" value="Create" class="btn btn-default"/>

</div>

</div>

</div>

}

创建Route

新增Routes.cs文件。返回指定的路由。


public class Routes :IRouteProvider

{

public IEnumerable<RouteDescriptor> GetRoutes() {

yield return new RouteDescriptor {

Route = new Route("MyHelloWorld", new RouteValueDictionary {

{"area", "XiaoGuang.HelloWorld"},

{"action", "Index"},

{"controller", "Home"}

}, new RouteValueDictionary(), new RouteValueDictionary {

{"area", "XiaoGuang.HelloWorld"}

}, new MvcRouteHandler())

};

yield return new RouteDescriptor

{

Route = new Route("admin/XiaoGuang.HelloWorld/Update", new RouteValueDictionary {

{"area", "XiaoGuang.HelloWorld"},

{"action", "Update"},

{"controller", "Admin"}

}, new RouteValueDictionary(), new RouteValueDictionary {

{"area", "XiaoGuang.HelloWorld"}

}, new MvcRouteHandler())

};

}

public void GetRoutes(ICollection<RouteDescriptor> routes) {

foreach (var route in GetRoutes()) {

routes.Add(route);

}

}

}

创建Admin Menu

该功能用于产生一个后台导航菜单,定位到管理页面。相信代码直接读就可以理解。需要继承于INavigationProvider。


public class AdminMenu : INavigationProvider {

public string MenuName => "admin";

public Localizer T { get; set; }

public void GetNavigation(NavigationBuilder builder) {

builder.AddImageSet("helloworld").Add(T("HelloWorld"), "5", item => {

item.Action("Index", "Admin", new {area = "XiaoGuang.HelloWorld"});

});

}

}

需要特殊说明一下。public string MenuName => "admin";

这段代码是固定值,注意指的大小写。具体原因搜索下INavigationProvider相关引用就知道了。我可是不只一次入坑了。

时间: 2024-10-27 00:41:22

Orchard入门:如何创建一个完整Module的相关文章

SpringMVC基础入门,创建一个HelloWorld程序

ref:http://www.admin10000.com/document/6436.html 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!--configure the setting of springmvcDispatcherServlet and configure the ma

Android Wear 开发入门——如何创建一个手机与可穿戴设备关联的通知(Notification)

创建通知 为了创建在手机与可穿戴设备中都能展现的通知,可以使用 NotificationCompat.Builder.通过该类创建的通知,系统会处理该通知是否展现在手机或者穿戴设备中. 导入必要的类库 在开发之前首先需要导入以下类库 importandroid.support.v4.app.NotificationCompat; importandroid.support.v4.app.NotificationManagerCompat; importandroid.support.v4.app

RxJS入门(7)----创建一个完整的web application

在本章中,使用Rxjs,我们将创建一个典型的web application.我们将转化Dom Object Model(DOM)并且使用node.js中的websocket做c/s的交互. 用户界面部分,我们将使用RxJs-Domlibrary,这同样是Rxjs团队做的库,提供了方便的操作符来处理DOM和浏览器相关的使我们的编码更容易.服务器端:我们将是使用两个建立很好的node库,并用Observable封装他们的一些API到我们的application中. 在这一章之后,你将能使用RxJs创

RxJS入门(8)----创建一个完整的web application

上接(7) Getting Real-Time Updates from Twitter 我们计划的的第二部分是做一个实时的仪表给地震,添加从Twitter相关的地球上正在发生的不同地震报告和信息.为了实现这个,我们需要创建一个小的Node.js程序,它获取tweets相关的地震的流. Setting Up Our Node.js Environment 配置我们的Node.js程序.包括RxJS,我们将会使用两个比较重要的第三方modules使我们的编程会更容易:ws和twit.其他任何相似的

OC入门,创建一个Person工程,给新手用

创建一个Person工程 main.m #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { /*____________________创建person对象______________________*/ //在OC里面对象使用指针声明的 //alloc在内存中申请一块内存,用来存储此对象的信息 // Person *person = [

CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)

下面具体的webservice实现类直接用的是上面的,这里不再说明 CXF拦截器使用,创建一个使用SOAPHeader的安全验证   xml格式: <soap:Header> <auth:authentication xmlns:auth="http://gd.chinamobile.com//authentication"> <auth:systemID>1</auth:systemID> <auth:userID>test

CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用)

注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 以下是服务端配置 ======================================================== 一,web.xml配置,具体不在详述 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.

创建一个完整的域

前言 我们按照下图来创建第一个林中的第一个域.创建方法为先安装一台Windows服务器,然后将其升级为域控制器.然后创建第二台域控制器,一台成员服务器与一台加入域的Win8计算机. 环境 网络192.168.100.1 子网掩码 255.255.255.0 网关192.168.100.2 域名 contoso.com DC1 192.168.100.11/24 DC2 192.168.100.12/24 Server 192.168.100.13/24 PC1 192.168.100.14/24

Docker 使用入门,创建一个Nginx服务器

运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 docker run -p 8080:80 --name nginx_web -it nginx /bin/bash 二.了解Nginx 镜像的配置文件位置 日志文件位置:/var/log/nginx 配置文件位置: /etc/nginx 资源存放的位置: /usr/share/nginx/html 上面的