nopcommerce裏面的@Html.Widget("home_page_top") 是什麼?

不少朋友在修改模板的時候看到不少相似@Html.Widget("xxx")的東西,這裏簡單介紹一下流程:html

好比@Html.Widget("home_page_top"),首先要知道Html.Widget是什麼,這是Html的一個擴展方法,位於Nop.Web.Framework\HtmlExtensions.cside

1
2
3
4
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傳遞給試圖:post

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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:this

1
2
3
4
5
6
@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)就是這個插件具體輸出的內容,大致流程就是這樣了。spa

原文出處 http://www.nopchina.net/post/nopcommerce-widget.html.net

相關文章
相關標籤/搜索