很多朋友在修改模板的时候看到很多类似@Html.Widget("xxx")的东西,这里简单介绍一下流程:

比如@Html.Widget("home_page_top"),首先要知道Html.Widget是什么,这是Html的一个扩展方法,位于Nop.Web.Framework\HtmlExtensions.cs

public static MvcHtmlString Widget(this HtmlHelper helper, string widgetZone)
{
return helper.Action("WidgetsByZone", "Widget", new { widgetZone = widgetZone });
}

可以看到这里面调用的是action,找到WidgetController下面的WidgetsByZone,这是一个child action(不懂的百度一下),读一下代码,就能了解这个方法就是通过反射获取到实现接口IWidgetPlugin并且GetWidgetZones()包含home_page_top的插件的列表,然后创建一个model传递给试图:

[ChildActionOnly]
public ActionResult WidgetsByZone(string widgetZone)
{
//model
var model = new List<RenderWidgetModel>(); var widgets = _widgetService.LoadActiveWidgetsByWidgetZone(widgetZone, _storeContext.CurrentStore.Id);
foreach (var widget in widgets)
{
var widgetModel = new RenderWidgetModel(); string actionName;
string controllerName;
RouteValueDictionary routeValues;
widget.GetDisplayWidgetRoute(widgetZone, out actionName, out controllerName, out routeValues);
widgetModel.ActionName = actionName;
widgetModel.ControllerName = controllerName;
widgetModel.RouteValues = routeValues; model.Add(widgetModel);
} return PartialView(model);
}

打开试图Widget\WidgetsByZone.cshtml:

@model List<RenderWidgetModel>
@using Nop.Web.Models.Cms;
@foreach (var widget in Model)
{
@Html.Action(widget.ActionName, widget.ControllerName, widget.RouteValues)
}

这个试图的目的就是循环输出html,具体输出的内容在插件里面实现的,比如插件Nop.Plugin.Widgets.NivoSlider里面有个NivoSliderPlugin,这类插件必须继承自BasePlugin,和IWidgetPlugin,里面的方法GetDisplayWidgetRoute就是用于返回显示这个插件内容的action的信息,WidgetsNivoSliderController.cs里面的public ActionResult PublicInfo(string widgetZone)就是这个插件具体输出的内容,大体流程就是这样了。

分享是一种美。版权所有,转载请注明出处 http://www.nopchina.net/

最新文章

  1. VS2015 Git 源码管理工具简单入门
  2. map 函数----filter函数
  3. Apple的LZF算法解析
  4. 因为此控件已在 web.config 中注册并且与该页位于同一个目录中
  5. 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest F. Friends
  6. 公众号开发学习Day01
  7. discuz random函数
  8. postInvalidate、removeAllViewsInLayout、refreshDrawableState用法
  9. js获取url的get传值函数
  10. 温故而知新 C++基本类型
  11. BNU Online Judge-29140
  12. VisionPro随笔-Visionpro空间字符的含义
  13. java并发包小结(一)
  14. Oracle基础知识点——Oracle服务端和客户端
  15. JavaScript 下拉框 左边添加至右边
  16. python(32)——【shelve模块】【xml模块】
  17. 质量团队在VUCA时代如何走?
  18. Vue中 等待DOM或者数据完成 在执行 --this.$nextTick()
  19. 关于transform-style:preserve-3d的些许明了
  20. iOS UIScrollView 3种分页方法,间隔实现

热门文章

  1. 关于c#的一些笔记
  2. WPF listbox UI虚拟化
  3. CSS 最核心的四个概念(摘录)
  4. 为什么不推崇复杂的ORM
  5. winform(进程和线程)
  6. 关于HTML的编码问题
  7. 将内表通过TXT文本输出
  8. ArcGIS制图之Sub Points点抽稀
  9. android 读中文文本文件
  10. andriod 读取网络图片