nopcommerce有着完善的插件处理机制。开发人员可以预先开发好独立运行的模块,在通过自身的插件机制即可加载实现该插件功能。这种插件模式有利于模块化编程,提高扩展性以及降低模块之间的耦合度。下面,我们将添加一个自定义的插件Demo并介绍如何管理插件。

1.新建类库项目:右键“添加”--“新建项目”--“类库”。默认的规则是”Nop.Plugin.{Group}.{Name}”。{Group}表示插件的分类(如支付、挂件(Widget)),{Name}是你的插件名 (”HelloWorld”),该Demo中的名字就是“Nop.Plugin.Widgets.HelloWorld”。

2.指定文件输出路径:右键文件属性。将文件的输出路径改为\Presentation\Nop.Web\Plugins\Widgets.HelloWorld。注意区分Plugins文件下的插件。

3.添加dll引用如图。右键dll文件属性,“复制到本地”改为"false"。这样可以避免生成许多不必要的dll文件到输出路径。

4:添加描述文件。文件的格式可以参考其他插件。我的Description文件如下:

Group: Widgets
FriendlyName: HelloWorld
SystemName: Widgets.HelloWorld
Version: 1.00
SupportedVersions: 1.00
Author: Jayson
DisplayOrder: 1
FileName: Plugin.Widgets.HelloWorld.dll
Description: A test program

右键该文件“属性”--“复制到本地”--“如果较新时复制”。保证该文件为最新。web.config文件可直接复制其他插件的。

5:实现插件接口“IWidgetPlugin”、“BasePlugin”。“IWidgetPlugin”继承自“IPlugin”,“IPlugin”是插件操作的最终接口,因为这个demo是划分在“挂件”(小部件。 Widget是呈现在您的网站的某些部分,主页的banner图就是挂件技术实现的)里的所以继承“IWidgetPlugin”,具体代码如下:

 public class HelloWorldPlugin : BasePlugin, IWidgetPlugin{public HelloWorldPlugin() { }public void GetConfigurationRoute(out string actionName, out string controllerName, out System.Web.Routing.RouteValueDictionary routeValues){actionName = "Configure";controllerName = "WidgetsHelloWorld";routeValues = new RouteValueDictionary() { { "Namespaces", "Nop.Plugin.Widgets.HelloWorld.Controllers" }, { "area", null } };}public void GetDisplayWidgetRoute(string widgetZone, out string actionName, out string controllerName, out System.Web.Routing.RouteValueDictionary routeValues){actionName = "PublicInfo";controllerName = "WidgetsHelloWorld";routeValues = new RouteValueDictionary(){{"Namespaces", "Nop.Plugin.Widgets.HelloWorld.Controllers"},{"area", null},{"widgetZone", widgetZone}};}public IList<string> GetWidgetZones(){return new List<string>() { "home_page_helloworld" };}/// <summary>/// 安装插件/// </summary>public override void Install(){base.Install();}/// <summary>/// Uninstall plugin/// </summary>public override void Uninstall(){base.Uninstall();}}6:添加控制器、模型以及视图,文件结构如下:。Controller负责响应一个ASP.NET MVC网站提出的请求,代码如下:
  public WidgetsHelloWorldController() { }[ChildActionOnly]public ActionResult Configure(){return View("~/Plugins/Widgets.HelloWorld/Views/WidgetsHelloWorld/Configure.cshtml");}[HttpPost][ChildActionOnly]public ActionResult Configure(ConfigurationModel model){return Configure();}[ChildActionOnly]public ActionResult PublicInfo(string widgetZone, object additionalData = null){return View("~/Plugins/Widgets.HelloWorld/Views/WidgetsHelloWorld/PublicInfo.cshtml", null);}

当请求控制器时,会跳转到对应指定的视图。该程序中,视图文件只是做简单的演示,并不复杂,“PublicInfo”视图文件如下:
@model Nop.Plugin.Widgets.HelloWorld.Models.PublicInfoModel
@{Layout = "";
}
@using System<div class="con" style="font-weight:bold; color:red;"><ul><li>HelloWorld Nopcommerce</li><li>HelloWorld Nopcommerce</li><li>HelloWorld Nopcommerce</li><li>HelloWorld Nopcommerce</li><li>HelloWorld Nopcommerce</li><li>HelloWorld Nopcommerce</li></ul>
</div>

注意:需要保持视图文件实时更新。右键“Views”文件夹中的视图文件,选择“较新时复制”这样,一个简单的挂件类型的插件就开发完成了。在前台调用,添加“ @Html.Widget("home_page_helloworld")”,注意“home_page_helloworld”需要和上文“HelloWorldPlugin ”中“GetWidgetZones”返回值一致,否则找不到挂件的
显示效果图如下:

转载于:https://www.cnblogs.com/SecondSun/p/7422036.html

nopcommerce的挂件技术相关推荐

  1. 「镁客·请讲」红茶移动金辉:以”eSIM技术和服务提供商”为定位,解决手机通信、物联网的诸多痛点...

    在金辉看来,对数据保存时间的要求.设备迁移时SIM卡换卡困难.SIM卡生命周期比设备生命周期短等等痛点都是可以用eSIM技术所解决的. 近几年来,我们常常能看见一些新闻,比如出国旅游打开移动网络刷个朋 ...

  2. 收集的计算机编程电子书目录,仅供日后查阅方便

    本人有收集电子书的癖好.每日在网上收集经典的电子书籍,尤其喜欢原版的,看起来舒服.不过总是心血来潮,当时下载后瞅几眼,之后就束之高阁,再也不问津了.很为此苦恼,过后找某本书时也总是不知道在哪,为了查找 ...

  3. Java实现lucene搜索功能

    直接上代码: package com.sand.mpa.sousuo;//--------------------- Change Logs---------------------- //<p ...

  4. Nopcommerce主要用到的技术及特点

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  5. 用 Blink 打造你的技术朋友圈

    有多少小伙伴至今都还不知道Blink呢? Blink上有一个话题叫:来了,奇怪的冷知识,最大的冷知识就是:千万级CSDN 用户,只有几十万人在使用Blink! 所以接下来,一起来看看你为什么要发Bli ...

  6. 基于NopCommerce的开源电商系统改造总结

    距离项目的结项会议差不多有一个月的时间了,研发人员也基本上都从该项目撤出.之前一直就想写一下这个项目的总结无奈身兼多职未能抽出身来写这篇文章.不过我们有幸能够在项目开始之初就接触到了.NET领域优秀的 ...

  7. 音视频技术在云会议场景的拓展和未来

    音视频技术不断发展,云会议场景在人们生活中也越来越常见.那么如何将云会议场景中的音视频技术不断提升改善?本次分享会我们邀请到了来自腾讯会议的商世东先生,他将与我们分享云视频技术在腾讯会议里面的一些领域 ...

  8. 音视频低延迟应用的四个技术实践

    低延时是音视频领域最常遇到的关键诉求,如何设计解决方案以满足低延时的应用场景至关重要,本文将基于低延时的解决方案和实例进行讲解,分享一些应用的实践,帮助开发者更快地将解决方案应用到产品中.内容来自即构 ...

  9. 语音视频社交背后技术深度解析

    演讲 / 蒋宁波 整理 / LiveVideoStack 伴随智能硬件设备快速发展和网络条件提升,实时语音视频的应用越来越广泛,从互动直播.到休闲游戏.再到陌生人社交,而如何保障实时互动过程流畅不卡顿 ...

最新文章

  1. linux svn自动提交,svn 定时自动提交
  2. 《数据虚拟化:商务智能系统的数据架构与管理》一 1.11 数据集成的其他方式...
  3. 在Mac OS X Lion上设置环境变量
  4. 001_支持并发的两次判空懒汉单例
  5. spring配置连接mysqlxml
  6. c++ 静态变量赋值_Python变量及常量解释说明
  7. javascript事件处理程序
  8. Node.js-json-模块化-全局对象-fs-服务-Buffer
  9. object not found php,找不到PHP错误对象
  10. java 综合练习_Java第二季6-1综合练习作业
  11. centos 编译内核至2.6.39.4
  12. Sparklyr与Docker的推荐系统实战
  13. c语言强制停止程序,C语言实现程序的暂停
  14. 小程序分包Error: 分包大小超过限制,main package source
  15. 五款堪称神奇的手机APP 一定不要错过了
  16. 惠普103a打印机芯片清零_惠普M104a打印机的粉盒CF218A,芯片怎么取下来啊
  17. 转一篇经典音响文章《“摩机”宝典之如何“摩功放”》
  18. img标签图片的刷新,删除
  19. fread和 fgets的区别:
  20. Python【每日一问】23

热门文章

  1. 关于同一线程两次调用EnterCriticalSection的测试
  2. 分享95个ASP整站程序源码,总有一款适合您
  3. 配置org.springframework.scheduling.quartz.CronTriggerBean
  4. android数据回传的代码,android Activity之间数据传递 Parcelable和Serializable接口的使用...
  5. 江苏科技大学计算机系2019年录取分数线,2019年江苏科技大学优势专业排名及分数线...
  6. 持续集成与持续部署(三)——实现持续集成的效率工具对比之Jenkins、Travis CI、Circle CI和其他持续集成工具
  7. python3 if x 和 if x is not None 区别
  8. JavaScript里的event
  9. LayaAir2.13.0
  10. spss实现k均值聚类