




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Orchard中的命令行工具在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户、创建博客、生成代码、配置网站、打包模块等。并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类,并继承于Orcahrd框架所提供的DefaultOrchardCommandHandler。这样我们就可以在这个类中实现自己模块可以提供的命令了。具体实现方式,可以参考默认提供的Orchard.Users模块中的UserCommands.cs文件。启动此命令行工具,可以在Orchard网站的Bin目录下,执行orchard.exe文件。就是在项目文件中的Orchard.WebBin目录下。等待命令行工具初始成功后,会出现一个“orchard”提示行。在这里我们就可以输入相应的一些命令了。比如Orchard框架提供的help commands。 它会列出全部可以使用的命令。 输入:help (help + 相应的命令会显示此相应命令的帮助信息),如输入Help user create,显示如下:它提示我们在使用创建用户这个命令的时候该如何输入相应的参数。 默认提供的命令都给出了很清楚的解释,就不在这里浪费篇幅介绍了,只要大家使用 help commands命令列一下就都清楚了。在这里重点介绍一下自动生成代码模板的命令,这在我们做Orchard模块开发的时候会很有用。 如果需使用Orachard的代码自动生成功能,就需要先安装一个Code Generation模块。我们可以在Orchard网站的管理后台的模块市场中找到它并安装。安装完成后在Features中启用一下这个模块。当然我们也可以用命令行工具去启用它,如:orchard feature enable Orchard.CodeGeneration。 当Orchard.CodeGeneration启用后,我们就可以在Orchard命令行中运行相应的命令来创建模块了。创建模块在Orchard命令行工具中输入:codegenmoduleJT56.Advertisement模块创建成功后,可以在Orchard的Module目录中看见我们刚创建的模块项目。模块项目创建好以后,就要创建Migrations,定义ContentType,以及创建表结构Migrations在Orchard中提供了一套模块的安装和升级机制。当模块需要用到数据库的时候,Orchard通过一个Migrations.cs文件去创建和更新数据库。在Orchard命令行工具中输入以下命令,即可创建Migrations.cs文件模板。Codegen datamigration JT56.AdvertisementMigrations.cs代码如下:public class Migrations : DataMigrationImpl public Localizer T get; set; public Migrations() T = NullLocalizer.Instance; public int Create() /创建表结构 SchemaBuilder.CreateTable(AdvertisementPartRecord, table = table.ContentPartRecord() .Column(Alimama, cfg = cfg.WithLength(1024) /定义表字段,数据类型 .Column(UrlAddress, cfg = cfg.WithLength(100) .Column(Remark, cfg = cfg.WithLength(100) .Column(Image, cfg = cfg.WithLength(100) .Column(Title, cfg = cfg.WithLength(100) ); /定义ContentPart ContentDefinitionManager.AlterPartDefinition(AdvertisementPart, builder = builder.Attachable().WithField(Image, fieldBuilder = fieldBuilder.OfType(MediaLibraryPickerField).WithDisplayName(展示图) .WithSetting(MediaLibraryPickerFieldSettings.Required,True)/定义Field,设置必须输入属性 .WithDescription(Advertisement Part.); /定义ContentType ContentDefinitionManager.AlterTypeDefinition(Advertisement, cfg = cfg.DisplayedAs(广告管理).WithPart(CommonPart, p = p.WithSetting(OwnerEditorSettings.ShowOwnerEditor, False).WithPart(AdvertisementPart).WithPart(AutoroutePart, part = part.WithSetting(AutorouteSettings.AllowCustomPattern,false).WithSetting(AutorouteSettings.AutomaticAdjustmentOnEdit, false).WithSetting(AutorouteSettings.PatternDefinitions, Name:Advertisement, Pattern: /gggl/Content.Id, Description: Advertisement).WithSetting(AutorouteSettings.DefaultPatternIndex, 0).WithPart(ViewCountPart).Creatable().Draftable(); return 1; 定义好AdvertisementPart,以及创建表AdvertisementPartRecord后,在Models中定义AdvertisementPart ModelModel当前模块中所提供的独有的内容部分的领域模型类和对应的数据记录类。这与传统的 ASP.NET MVC 项目的 Models 文件夹的含义并无二致,但在 Orchard 模块开发中,我们可以使用系统提供的ContentPart基础设施轻松建立起与 CMS处理管线高度集成的自己的内容部分;在Models文件夹下添加AdvertisementPart.cs,AdvertisementPartRecord.cs两个文件,AdvertisementPartRecord.cs的代码如下:public class AdvertisementPartRecord : ContentPartRecord public virtual string Alimama get; set; /广告位 public virtual string UrlAddress get; set; /广告链接 public virtual string Remark get; set; /备注 public virtual string Image get; set; /定义Field public virtual string Title get; set; /名称AdvertisementPart.cs的代码如下:public class AdvertisementPart : ContentPart public string Alimama get return Retrieve(x = x.Alimama); set Store(x = x.Alimama, value); public string UrlAddress get return Retrieve(x = x.UrlAddress); set Store(x = x.UrlAddress, value); public string Remark get return Retrieve(x = x.Remark); set Store(x = x.Remark, value); public string Image get return Retrieve(x = x.Image); set Store(x = x.Image, value); public string Title get return Retrieve(x = x.Title); set Store(x = x.Title, value); 建好相关的Model后,就应该创建相关的ContentPartDriver,来处理ContentPart的显示以及编辑DriversDrivers放置用于指示如何显示和编辑当前模块中特有的内容部分(ContentPart)的驱动程序,通常继承于Orchard框架中的ContentPartDriver,可重写其查看界面显示方法(Display)、编辑界面显示方法(EditorGet时执行),编辑界面提交方法(EditorPost时执行),还有其他一些导入导出之类的方法。从这些重写的方法来看,驱动器就好比是内容部件的Controller,驱动器中的方法就好比是内容部件的Action。在项目中创建文件夹Handlers和Drivers,在Drivers文件夹下面添加AdvertisementDriver.cs文件,输入代码如下:public class AdvertisementDriver : ContentPartDriver private readonly IAdvertisementService _advertisementService; public AdvertisementDriver(IAdvertisementService advertisementService) _advertisementService = advertisementService; protected override string Prefix get return AdvertisementPart; / / 显示界面显示时执行(相当于Action) / / 相当于此Part的Model / 显示类型(如:details(详情显示)或 summary(摘要显示) / 类似视图引擎之类的东西,可以根据相应显示的动态对象去找对应的显示模板(相当于View) / 这里相当于是返回了一个ActionResult,Orchard框架会针对这个返回值进行相应处理 protected override DriverResult Display(AdvertisementPart part, string displayType, dynamic shapeHelper) return ContentShape(Parts_Advertisement, () = shapeHelper.Parts_Advertisement(); / / 编辑界面显示时执行(Get) / / / / protected override DriverResult Editor(AdvertisementPart part, dynamic shapeHelper) return ContentShape(Parts_Advertisement_Edit, () = shapeHelper.EditorTemplate(TemplateName: Parts/Advertisement, Model: BuildEditorViewModel(part), Prefix: Prefix); / / 编辑界面提交时执行(Post) / / / / / protected override DriverResult Editor(AdvertisementPart part, Orchard.ContentManagement.IUpdateModel updater, dynamic shapeHelper) var model = new AdvertisementViewModel();updater.TryUpdateModel(model, Prefix, null, null); /更新入库 if (part.ContentItem.Id != 0) /更新AdvertisementPart数据入库_advertisementService.UpdateAdvertisementForContentItem(part.ContentItem, model); return Editor(part, shapeHelper); public AdvertisementViewModel BuildEditorViewModel(AdvertisementPart part) return new AdvertisementViewModel() Alimama = part.Alimama, UrlAddress = part.UrlAddress, Remark = part.Remark, Title=part.Title ; protected override void Importing(AdvertisementPart part, Orchard.ContentManagement.Handlers.ImportContentContext context) part.Alimama = context.Attribute(part.PartDefinition.Name, Alimama); part.Remark = context.Attribute(part.PartDefinition.Name, Remark); part.UrlAddress = context.Attribute(part.PartDefinition.Name, UrlAddress); part.Image = context.Attribute(part.PartDefinition.Name, Image); part.Title = context.Attribute(part.PartDefinition.Name, Title); / base.Importing(part, context); protected override void Exporting(AdvertisementPart part, Orchard.ContentManagement.Handlers.ExportContentContext context) context.Element(part.PartDefinition.Name).SetAttributeValue(Alimama, part.Alimama); context.Element(part.PartDefinition.Name).SetAttributeValue(Remark, part.Remark); context.Element(part.PartDefinition.Name).SetAttributeValue(UrlAddress, part.UrlAddress); context.Element(part.PartDefinition.Name).SetAttributeValue(Image, part.Image); context.Element(part.PartDefinition.Name).SetAttributeValue(Title, part.Title); /base.Exporting(part, context); ViewModelsViewModels存放MVC 视图使用的视图模型类,与Models中的区别是:Models中存放的是ContentPart的模型类和对应的数据记录类;在ViewModels中添加AdvertisementViewModel.cs文件,代码如下:ASP.NET MVC中Model验证,在Layout中加上相应的JS就实现前台验证public class AdvertisementViewModel Required(ErrorMessage = 标题不能为空) StringLength(50, ErrorMessage = 标题长度不能大于50) public string Title get; set; /Required(ErrorMessage = 广告链接不能为空) Url(ErrorMessage = 广告链接地址有误,请重新输入) public string UrlAddress get; set; public string Remark get; set; Required(ErrorMessage = 广告位不能为空) public string Alimama get; set; HandlersHandlers存放当前模块特有的内容部分的数据相关的处理(如数据存取、索引和与其他内容部分的相关性等)程序,通常继承于Orchard框架中的ContentHandler,它定义了相应内容部件的行为、事件以及在呈现前操作数据模型。我们可以把它理解为内容部件的Filter,负责告诉Orchard框架如何处理你的Part在Handlers文件夹下添加AdvertisementHandler.cs文件,代码如下:public class AdvertisementHandler : ContentHandler public AdvertisementHandler(IRepository repository) Filters.Add(StorageFilter.For(repository); ServicesServices用于为控制器提供数据和其他领域模型间的逻辑操作的服务程序;在模块的根目录下,添加文件夹Services,在Services文件夹下添加接口文件 IAdvertisementService.cs,代码如下:public interface IAdvertisementService : IDependency / / 更新AdvertisementPartRecord数据 / / / void UpdateAdvertisementForContentItem(ContentItem item, AdvertisementViewModel model);/ / 获取ContentType为:Advertisement的列表 / / IEnumerable GetAllAdvertisementInfo();再在Services文件夹下添加实现接口IAdvertisementService 的AdvertisementService.cs文件,代码如下:public class AdvertisementService : IAdvertisementService private readonly IRepository _advertisementRepository; private readonly IContentManager _contentManager; public AdvertisementService(IRepository advertisementRepository, IContentManager contentManager) _advertisementRepository = advertisementRepository; _contentManager = contentManager; public void UpdateAdvertisementForContentItem(ContentItem item, AdvertisementViewModel model) var newsPart = item.As(); newsPart.Alimama = model.Alimama; newsPart.UrlAddress = model.UrlAddress; newsPart.Remark = model.Remark; newsPart.Title = model.Title; _advertisementRepository.Flush(); public IEnumerable GetAllAdvertisementInfo() IEnumerable result = _contentManager.Query(VersionOptions.Published, Advertisement).List(); return result; 定义好Services以后,创建各个ContentPart的显示View以及编辑ViewView在模块的View目录下分别创建一个Parts目录和一个EditorTemplates目录, 并在Parts目录中创建一个Advertisement.cshtml文件用于显示画面, Model.Alimama Model.UrlAddress Model.Remark Model.Image Model.Title 然后我们在EditorTemplates目录下再创建一个Parts目录并创建一个Advertisement.cshtml文件用于编辑画面,输入以下代码: T(标题:) Html.TextBoxFor(m = m.Title, new class = name_input, maxlength = 512 ) T(广告位:) Html.DropDownListFor(m = m.Alimama, new List() new SelectListItemText=请选择,Value=,Selected=true, new SelectListItemText=首页广告位,Value=1, new SelectListItemText=列表页广告位,Value=2, new SelectListItemText=详细页广告位,Value=3, new class = ad_addr, maxlength = 512 ) T(广告链接:) Html.TextBoxFor(m = m.UrlAddress, new class = name_input, maxlength = 512 ) 链接格式如: T(备注:) Html.TextBoxFor(m = m.Remark, new class = name_input, maxlength = 512 ) helper IsPropertyRequired(Type type, string property) (Attribute.IsDefined(type.GetProperty(property), typeof(RequiredAttribute) ? required : )PermissionsPermissions是存放当前模块所需要使用的专有权限体系;在Permissions文件夹下,添加AdvertisementPermissions.cs文件,其输入代码如下: public class AdvertisementPermissions : IPermissionProvider public static readonly Permission ManageNews = new Permission Description = Manage About, Name = ManageNews ; public static readonly Permission PublishContent = new Permission Description = Publish or unpublish content for others, Name = PublishContent ; public static readonly Permission PublishOwnContent = new Permission Description = Publish or unpublish own content, Name = PublishOwnContent, ImpliedBy = new PublishContent ; public static readonly Permission EditContent = new Permission Description = Edit content for others, Name = EditContent, ImpliedBy = new PublishContent ; public static readonly Permission EditOwnContent = new Permission Description = Edit own content, Name = EditOwnContent, ImpliedBy = new EditContent, PublishOwnContent ; public static readonly Permission DeleteContent = new Permission Description = Delete content for others, Name = DeleteContent ; public static readonly Permission DeleteOwnContent = new Permission Description = Delete own content, Name = DeleteOwnContent, ImpliedBy = new DeleteContent ; public static readonly Permission ViewContent = new Permission Description = View all content, Name = ViewContent, ImpliedBy = new EditContent ; public static readonly Permission ViewOwnContent = new Permission Description = View own content, Name = ViewOwnContent, ImpliedBy = new ViewContent ; public static readonly Permission MetaListContent = new Permission ImpliedBy = new EditOwnContent, PublishOwnContent, DeleteOwnContent ; public virtual Feature Feature get; set; public IEnumerable GetPermissions() return new ManageNews, EditOwnContent, EditContent, PublishOwnContent, PublishContent, DeleteOwnContent, DeleteContent, ViewContent, ViewOwnContent ; public IEnumerable GetDefaultStereotypes() return new new PermissionStereotype Name = Administrator, Permissions = new ManageNews , new PermissionStereotype Name = Administrator, Permissions = new PublishContent,EditContent,DeleteContent , new PermissionStereotype Name = Editor, Permissions = new PublishContent,EditContent,DeleteContent , new PermissionStereotype Name = Moderator, , new PermissionStereotype Name = Author, Permissions = new PublishOwnContent,EditOwnContent,DeleteOwnContent , new PermissionStereotype Name = Contributor, Permissions = new EditOwnContent , new PermissionStereotype Name = Authenticated, Permissions = new ViewContent , new PermissionStereotype Name = Anonymous, Permissions = new ViewContent , ; Controllers Controllers存储当前模块需要用于处理客户端请求的 ASP.NET MVC 控制
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国高档原木门行业发展监测及投资前景预测报告
- 2025年中国钳子套件行业市场调查研究及投资前景预测报告
- 2025至2030木门窗产业市场深度调研及发展现状趋势及有效策略与实施路径评估报告
- 2025至2030嵌入式订户身份模块(eSIM)行业产业运行态势及投资规划深度研究报告
- 2025至2030全球及中国汽车租赁服务行业产业运行态势及投资规划深度研究报告
- 2025至2030中国灌注混合物行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国滤色玻璃行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国混凝土搅拌桩行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国涤纶纤维市场经营效益及未来投资走势预测报告
- 2025至2030中国汽车扫描工具行业发展趋势分析与未来投资战略咨询研究报告
- 2025届上海市闵行区21学校七年级生物第二学期期末调研试题含解析
- 火灾自动报警系统故障应急预案
- 《拓印新貌》教学课件-2024-2025学年沪书画版(五四学制)(2024)初中美术六年级下册
- 湖北省武汉市2025年中考语文二模试题(含答案)
- 25春国家开放大学《中国法律史》形考任务1-3参考答案
- 研发人员绩效考核及奖励制度
- 银行公文写作培训
- GB/T 20972.2-2025石油天然气工业油气开采中用于含硫化氢环境的材料第2部分:抗开裂碳钢、低合金钢和铸铁
- 2024-2025学年浙江绍兴诸暨市三下数学期末统考试题含解析
- 缓刑变更居住地申请书
- 小学四年级下册数学全单元测试题(及答案)
评论
0/150
提交评论