一:生成新项目

首先,要启动 Code Generation,参考《Orchard之生成新模板》。

其次,进入命令行,输入:

codegen module Tminji.Requirement

这会在解决方案中生成一个新项目,如下:

二:路由匹配

在新项目中创建 Routes.CS 文件,编码如下:

public class Routes : IRouteProvider {
    #region IRouteProvider 成员

public IEnumerable<RouteDescriptor> GetRoutes() {
        return new[] {
            new RouteDescriptor {
                Priority = 5,
                Route = new Route
                    (
                    "Requirement/{controller}/{action}/",
                    new RouteValueDictionary
                    {
                        {"area", "Tminji.Requirement"},
                        {"controller", "Home"},
                        {"action", "Index"}
                    },
                    new RouteValueDictionary(),
                    new RouteValueDictionary {{"area", "Tminji.Requirement"}},
                    new MvcRouteHandler()
                    )
            }
        };
    }

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

#endregion
}

三:新建控制器吧

接下来,就跟我们熟悉的 MVC 开发一样了,新建控制器,类似如下,可以创建视图,也可以没有视图,总之,输入 URL ,就会执行控制器代码了:

public class HomeController : Controller {
    public IOrchardServices Services { get; set; }

public HomeController(IOrchardServices services) {
        Services = services;
        T = NullLocalizer.Instance;
    }

public Localizer T { get; set; }

public ActionResult Index()
    {
        string model = "Hello World!"; 
        return View((object)model);    
    }
    public string About()
    {
        return "About me";
    }

}

四:在后台启用之

如下:

五:实效

或:

六:操作数据库

如果上面显式的文本我们要存储在数据库,那么,怎么实现?

1:创建数据库表

我们可以有两种方式来创建数据库表,一种是通过 Module 的 Update,我们需要在项目的根目录下创建一个文件 Migrations.CS,内容大致如下:

public class Migrations : DataMigrationImpl
{
    public int Create()
    {
        return 1;
    }

public int UpdateFrom1()
    {
        SchemaBuilder.CreateTable("RequirementRecord", table => table
            .ContentPartVersionRecord()
            .Column<int>("Id", column => column.PrimaryKey().Identity())
            .Column<string>("Content", column => column.WithLength(200))
        );
        ContentDefinitionManager.AlterPartDefinition("Tminji.Requirement",
            builder => builder.Attachable());
        return 2;
    }
}

这样,在我们下次登录后台的时候,就会在 Module 旁边,看到 Update,然后点击后,就会执行上述代码。

还有一种,当然是手动创建数据库表,这没有什么影响。数据库表是这样的:

2:实现后台管理这个 Content 的值

首先,我们得在 根目录下创建AdminMenu类型(备注:ORCHARD下很多命名都是固定死的,不能自己改变),如下:

public class AdminMenu : INavigationProvider {
    public Localizer T { get; set; }

#region INavigationProvider 成员

/* 指定这个菜单是一个管理菜单
     */
    public string MenuName {
        get { return "admin"; }
    }

public void GetNavigation(NavigationBuilder builder) {
        builder
            .AddImageSet("Requirement") //设置菜单图标(Orchard中默认约定调用Styles目录下的menu.xxxxxx-admin.css样式文件来显示菜单前面的图标)
            .Add(
                T("Requirement"), //菜单文本
                "5", //菜单位置(Orchard会根据这个值对菜单进行排序)
                menu => menu.Action(new RouteValueDictionary
                    {
                        {"area", "Tminji.Requirement"},
                        {"controller", "Admin"},
                        {"action", "Index"}
                    })
            );
    }
    #endregion
}

其次,我们创建 AdminController(固定死),编码如下:

public class AdminController : Controller
{
    // GET: Admin
    private readonly IRequirementService _textService;

public AdminController(IRequirementService textService)
    {
        _textService = textService;
    }

public ActionResult Index()
    {
        var viewModel = new RequirementPart();
        var textRecord = _textService.GetText();

if (textRecord != null)
        {
            viewModel.Content = textRecord.Content;
        }

return View(viewModel);
    }

[HttpPost, ActionName("Index")]
    [FormValueRequired("submit.Save")]
    public ActionResult IndexPost()
    {
        var viewModel = new RequirementPart();

if (!TryUpdateModel(viewModel))
        {
            return Index();
        }

//更新数据
        _textService.UpdateText(viewModel.Content);

return RedirectToAction("Index");
    }
}

前台代码如下:

Admin下的 index.cshtml:

@using Tminji.Requirement.Models
@model RequirementPart

<!--设置标题-->
@{ Layout.Title = T("Manage Hello World Text").ToString(); }

@Html.ValidationSummary()

@using (Html.BeginFormAntiForgeryPost())
{
    <fieldset>
        @Html.LabelFor(m => m.Content)
        @Html.TextBoxFor(m => m.Content, new { @class = "text" })
    </fieldset>
    <fieldset>
        <button class="primaryAction" type="submit" name="submit.Save" value="yes">@T("Save")</button>
    </fieldset>
}

3:数据访问层

orchard 的数据访问层是使用 nhibernate 实现的,我们同样可以把其换成 ADO.NET 的,注意上面的控制器中,存在 IRequirementService,以及隐藏存在的这个接口的一个实现类(ORCHARD)自动会为我们找到它并注入到控制器中,在这里,我们可以这样实现:

public interface IRequirementService : IDependency
{
    RequirementPart GetText();

RequirementPart UpdateText(string content);
}

[UsedImplicitly]
public class RequirementService : IRequirementService
{
    private readonly IRepository<Requirement> _textRepository;

public RequirementPartService(IRepository<Requirement> textRepository)
    {
        _textRepository = textRepository;
    }

#region ITextService 成员

public Requirement GetText()
    {
        var conn = @"Data Source=xxx;Initial Catalog=OrchardOk1;Persist Security Info=True;User ID=sa;Password=xxx";
        var sql = @"SELECT * FROM RequirementRecord";
        var ds = SqlHelper.ExecuteDataset(conn, CommandType.Text, sql, null);
        if (ds.Tables[0].Rows.Count == 0)
            return null;
        return new Requirement()
        {
            Id = (int)ds.Tables[0].Rows[0][0],
            Content = (string)ds.Tables[0].Rows[0][1]
        };
    }

public Requirement UpdateText(string content)
    {
        var conn = @"Data Source=xxx;Initial Catalog=OrchardOk1;Persist Security Info=True;User ID=sa;Password=xxx";
        string sql = "";
        var m = GetText();
        if (m == null)
        {
            sql = "INSERT INTO RequirementRecord (ID, [CONTENT]) VALUES (1, @CONTENT)";
        }
        else
        {
            sql = @"UPDATE RequirementRecord SET [CONTENT]=@CONTENT";
        }

var pms = new SqlParameter[] {
            new SqlParameter("@CONTENT", content)
        };
        SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sql, pms);
        return new Requirement()
        {
            Id = 1,
            Content = content,
        };
    }

#endregion
}

至于 home/index 这里,同理,就不在赘述了。

后台管理的实效如下:

Orchard之Module开发的更多相关文章

  1. Xposed Module开发教程1

    看了一下文档,发现Xposed这货实在太强大了,它直接对Zygote做了一些手脚,简直是无所不能.缺点就是需要安装一下框架.基本原理就是把Android 系统的app_process给替换了,然后启动 ...

  2. Android Studio多Module开发需要注意的问题

    多module开发,其中的一个为入口module,其他module为独立的“应用”(library) 1.在原有的项目导入另外个项目的module为主项目的次module,即在A项目中添加一个启动B项 ...

  3. Eclipse创建Maven多模块工程Module开发(图文教程)

    自己研究了下Eclipse用Maven多模块工程Module开发,跟大家分享一下! 功能模块来分Module,跟java的package类似,一般是按照的功能模块分module,比如:sso/cas/ ...

  4. Orchard之模版开发

    生成新模版之后(参看:Orchard之生成新模板),紧接着就是模版开发了. 一:开发必备之 Shape Tracing 到了这一步,非常依赖一个工具,当然,它也是 Orchard 项目本身的一个 Mo ...

  5. 【小结】IIS7下的Http Native Module开发

    今天接到Product Manager的通知,Exchange 2007环境下的Native Module不再需要开发(详情可见上篇),但最近几天一直在做Prototype,那就做一下小结吧,总结一下 ...

  6. Orchard之Module升级

    在上一篇中,我们提到了 Migrations,这一篇稍微衍生一下. 1:Migrations 是什么 Orchard 提供了模块升级的功能,即,如果我们模块发布后,需要进行升级,我们可以通过编码来实现 ...

  7. maven module开发 自动打包

    http://blog.csdn.net/u011113713/article/details/52413903 http://blog.csdn.net/sisyphus_z/article/det ...

  8. Orchard模块开发全接触1:起步

    在<http://www.cnblogs.com/luminji/p/3831281.html>中简单介绍了 Orchard 的模块开发,接下来,我们需要做个更复杂的例子,Orchard ...

  9. Orchard模块开发全接触2:新建 ProductPart

    一:创建 Part 1:项目引用 Orchard.Framework: 2:创建 Models 文件夹: 3:在 Models 文件夹下创建类 ProductPartRecord,如下: public ...

随机推荐

  1. CSS实现屏幕显示与打印结果不一样的方法

    文章作者:Tony Qu原创 一种方法是为屏幕显示和打印分别准备一个css文件,如下所示: 用于屏幕显示的css: <link rel="stylesheet" href=& ...

  2. 廉价的SUP掌机拆解

    最近经常出现的一款山寨sup掌机, 75元包邮入手, 全套配件如下. 看看正面和背面的实拍图, 比较明显的廉价玩具塑料感. 手柄和充电线共用下方的microUSB口, 所以在双打时是不能用电源供电的. ...

  3. Android UI系列-----长度单位和内外边距

    这篇随笔将会记录一下在控件布局时,设定距离的三种长度单位:px.dp.sp以及内外边距的属性 1.三种长度单位 ①px:px是我们常见的一种距离单位,它表示的是一个单位像素,我们经常说我们手机或者电脑 ...

  4. 使用VisualSVN Server搭建SVNserver (Windows环境为例)

    使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和Apache相配合来实现源代码的 SVN管理简单的多,下面就看看详细的说明. VisualSVN Server的 ...

  5. 脚本加密http://www.datsi.fi.upm.es/~frosal/sources/

    shc的官网下载地址: http://www.datsi.fi.upm.es/~frosal/sources/ 安装: 复制代码 代码如下: tar xzvf shc-.tgz cd shc- mkd ...

  6. Java知多少(74)基础类库

    Java 的类库是 Java 语言提供的已经实现的标准类的集合,是 Java 编程的 API(Application Program Interface),它可以帮助开发者方便.快捷地开发 Java ...

  7. Kiss MySQL goodbye for development and say hello to HSQLDB

    The days of using MySQL, DB2, PostgreSQL etc for development is  over.. I don’t know why any program ...

  8. laravel 5.4 中使用migrate

    1. 创建表结构 a. 命令: php artisan make:migration create_posts_table 2.生产文件 <?php use Illuminate\Support ...

  9. firadisk 把 win7(32位) 装入 VHD :仅仅支持内存模式:--mem

    关键1:对于 win7(32位)来说,还可以在设备管理器内,通过添加“过时”硬件的方式导入wvblk驱动. 附件: grub4dos firadisk驱动

  10. python对象池模式

    class QueueObject(): def __init__(self, queue, auto_get=False): self._queue = queue self.object = se ...