예제 #1
0
        public IActionResult AppendWidget(WidgetBase widget)
        {
            if (widget == null || widget.PageID.IsNullOrWhiteSpace())
            {
                return(NotFound());
            }
            //set design environment
            HttpContext.RequestServices.GetService <IApplicationContextAccessor>().Current.PageMode = Filter.PageViewMode.Design;
            var page = HttpContext.RequestServices.GetService <IPageService>().Get(widget.PageID);
            WidgetViewModelPart widgetPart = null;

            if (page != null)
            {
                var layout = HttpContext.RequestServices.GetService <Layout.ILayoutService>().Get(page.LayoutId);
                layout.Page = page;
                ControllerContext.HttpContext.TrySetLayout(layout);

                widgetPart = _widgetService.ApplyTemplate(widget, ControllerContext);
            }
            if (widgetPart == null)
            {
                widgetPart = new HtmlWidget {
                    PartialView = "Widget.HTML", HTML = "<h1 class='text-danger'><hr/>Error<hr/></h1>"
                }.ToWidgetViewModelPart();
            }
            return(PartialView("AppendWidget", new DesignWidgetViewModel(widgetPart, widget.PageID)));
        }
예제 #2
0
 public static async Task <IHtmlContent> DisplayWidget(this IHtmlHelper html, WidgetViewModelPart widget)
 {
     if (widget.ViewModel != null)
     {
         return(await html.PartialAsync("DisplayWidget", widget));
     }
     return(await html.WidgetError());
 }
예제 #3
0
 public static IHtmlContent DisPlayWidget(this IHtmlHelper html, WidgetViewModelPart widget)
 {
     if (widget.ViewModel != null)
     {
         return(html.Partial(widget.Widget.PartialView, widget.ViewModel));
     }
     return(html.WidgetError());
 }
        public static async Task <IHtmlContent> DisplayWidget(this IHtmlHelper html, WidgetViewModelPart widget)
        {
            if (widget.ViewModel != null)
            {
                var      logger       = html.ViewContext.HttpContext.RequestServices.GetService <ILogger <WidgetViewModelPart> >();
                DateTime startTime    = DateTime.Now;
                var      widgetResult = await html.PartialAsync("DisplayWidget", widget);

                logger.LogInformation("Render Widget [{0}]: {1}ms", widget.Widget.ServiceTypeName, (DateTime.Now - startTime).TotalMilliseconds);
                return(widgetResult);
            }
            return(await html.WidgetError());
        }
예제 #5
0
 public DesignWidgetViewModel(WidgetViewModelPart widgetPart, string pageId)
 {
     PageID    = pageId;
     ViewModel = widgetPart.ViewModel;
     Widget    = widgetPart.Widget;
 }
 public DesignWidgetViewModel(WidgetViewModelPart widgetPart, string pageId)
     : base(widgetPart.Widget, widgetPart.ViewModel)
 {
     PageID = pageId;
 }
예제 #7
0
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //Page
            var page = GetPage(filterContext);

            if (page != null)
            {
                var          requestServices           = filterContext.HttpContext.RequestServices;
                var          onPageExecuteds           = requestServices.GetServices <IOnPageExecuted>();
                var          layoutService             = requestServices.GetService <ILayoutService>();
                var          widgetService             = requestServices.GetService <IWidgetBasePartService>();
                var          applicationSettingService = requestServices.GetService <IApplicationSettingService>();
                var          themeService    = requestServices.GetService <IThemeService>();
                var          widgetActivator = requestServices.GetService <IWidgetActivator>();
                LayoutEntity layout          = layoutService.Get(page.LayoutId);
                layout.Page  = page;
                page.Favicon = applicationSettingService.Get(SettingKeys.Favicon, "~/favicon.ico");
                if (filterContext.HttpContext.User.Identity.IsAuthenticated && page.IsPublishedPage)
                {
                    layout.PreViewPage = requestServices.GetService <IPageService>().Get(page.ReferencePageID);
                }
                layout.CurrentTheme = themeService.GetCurrentTheme();
                layout.ZoneWidgets  = new ZoneWidgetCollection();
                filterContext.HttpContext.TrySetLayout(layout);
                widgetService.GetAllByPage(page, GetPageViewMode() == PageViewMode.Publish && !IsPreView(filterContext)).Each(widget =>
                {
                    if (widget != null)
                    {
                        IWidgetPartDriver partDriver = widgetActivator.Create(widget);
                        WidgetViewModelPart part     = partDriver.Display(widget, filterContext);
                        lock (layout.ZoneWidgets)
                        {
                            if (layout.ZoneWidgets.ContainsKey(part.Widget.ZoneID))
                            {
                                layout.ZoneWidgets[part.Widget.ZoneID].TryAdd(part);
                            }
                            else
                            {
                                layout.ZoneWidgets.Add(part.Widget.ZoneID, new WidgetCollection {
                                    part
                                });
                            }
                        }
                        partDriver.Dispose();
                    }
                });
                var viewResult = (filterContext.Result as ViewResult);
                if (viewResult != null)
                {
                    layout.Layout = GetLayout();
                    if (GetPageViewMode() == PageViewMode.Design)
                    {
                        layout.Templates = widgetService.Get(m => m.IsTemplate == true);
                    }
                    (filterContext.Controller as Controller).ViewData.Model = layout;
                }
                if (page.IsPublishedPage && onPageExecuteds != null)
                {
                    onPageExecuteds.Each(m => m.OnExecuted(page, filterContext.HttpContext));
                }

                layoutService.Dispose();
                applicationSettingService.Dispose();
                widgetService.Dispose();
                themeService.Dispose();
            }
            else
            {
                if (!(filterContext.Result is RedirectResult))
                {
                    filterContext.Result = new RedirectResult("~/error/notfond?f=" + filterContext.HttpContext.Request.Path);
                }
            }
        }
예제 #8
0
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //Page
            var page = GetPage(filterContext);

            if (page != null)
            {
                var requestServices           = filterContext.HttpContext.RequestServices;
                var onPageExecuteds           = requestServices.GetServices <IOnPageExecuted>();
                var layoutService             = requestServices.GetService <ILayoutService>();
                var widgetService             = requestServices.GetService <IWidgetBasePartService>();
                var applicationSettingService = requestServices.GetService <IApplicationSettingService>();
                var themeService    = requestServices.GetService <IThemeService>();
                var widgetActivator = requestServices.GetService <IWidgetActivator>();
                var ruleService     = requestServices.GetService <IRuleService>();

                LayoutEntity layout = layoutService.GetByPage(page);
                layout.Page  = page;
                page.Favicon = applicationSettingService.Get(SettingKeys.Favicon, "~/favicon.ico");
                if (filterContext.HttpContext.User.Identity.IsAuthenticated && page.IsPublishedPage)
                {
                    layout.PreViewPage = requestServices.GetService <IPageService>().Get(page.ReferencePageID);
                }
                layout.CurrentTheme = themeService.GetCurrentTheme();
                layout.ZoneWidgets  = new ZoneWidgetCollection();
                filterContext.HttpContext.TrySetLayout(layout);
                widgetService.GetAllByPage(page).Each(widget =>
                {
                    if (widget != null)
                    {
                        IWidgetPartDriver partDriver = widgetActivator.Create(widget);
                        WidgetViewModelPart part     = partDriver.Display(widget, filterContext);
                        if (part != null)
                        {
                            if (layout.ZoneWidgets.ContainsKey(part.Widget.ZoneID ?? UnknownZone))
                            {
                                layout.ZoneWidgets[part.Widget.ZoneID ?? UnknownZone].TryAdd(part);
                            }
                            else
                            {
                                layout.ZoneWidgets.Add(part.Widget.ZoneID ?? UnknownZone, new WidgetCollection {
                                    part
                                });
                            }
                        }
                        partDriver.Dispose();
                    }
                });
                var ruleWorkContext = new RuleWorkContext
                {
                    Url         = filterContext.HttpContext.Request.Path.Value,
                    QueryString = filterContext.HttpContext.Request.QueryString.ToString(),
                    UserAgent   = filterContext.HttpContext.Request.Headers["User-Agent"]
                };
                var rules   = ruleService.GetMatchRule(ruleWorkContext);
                var rulesID = rules.Select(m => m.RuleID).ToArray();
                if (rules.Any())
                {
                    widgetService.GetAllByRule(rulesID, !IsPreView(filterContext)).Each(widget =>
                    {
                        if (widget != null)
                        {
                            IWidgetPartDriver partDriver = widgetActivator.Create(widget);
                            WidgetViewModelPart part     = partDriver.Display(widget, filterContext);
                            var zone = layout.Zones.FirstOrDefault(z => z.ZoneName == rules.First(m => m.RuleID == widget.RuleID).ZoneName);
                            if (part != null && zone != null)
                            {
                                part.Widget.ZoneID = zone.HeadingCode;
                                if (layout.ZoneWidgets.ContainsKey(part.Widget.ZoneID ?? UnknownZone))
                                {
                                    layout.ZoneWidgets[part.Widget.ZoneID ?? UnknownZone].TryAdd(part);
                                }
                                else
                                {
                                    layout.ZoneWidgets.Add(part.Widget.ZoneID ?? UnknownZone, new WidgetCollection {
                                        part
                                    });
                                }
                            }
                            partDriver.Dispose();
                        }
                    });
                }
                var viewResult = (filterContext.Result as ViewResult);
                if (viewResult != null)
                {
                    layout.Layout = GetLayout();
                    if (GetPageViewMode() == PageViewMode.Design)
                    {
                        layout.Templates = widgetService.Get(m => m.IsTemplate == true);
                    }
                    (filterContext.Controller as Controller).ViewData.Model = layout;
                }
                if (page.IsPublishedPage && onPageExecuteds != null)
                {
                    onPageExecuteds.Each(m => m.OnExecuted(page, filterContext.HttpContext));
                }

                layoutService.Dispose();
                applicationSettingService.Dispose();
                widgetService.Dispose();
                themeService.Dispose();
            }
            else
            {
                if (!(filterContext.Result is RedirectResult))
                {
                    var viewResult = filterContext.Result as ViewResult;
                    if (viewResult != null)
                    {
                        viewResult.StatusCode = 404;
                        viewResult.ViewName   = "NotFound";
                    }
                    else
                    {
                        filterContext.Result = new RedirectResult("~/error/notfond?f=" + filterContext.HttpContext.Request.Path);
                    }
                }
            }
        }
예제 #9
0
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //Page
            var page = GetPage(filterContext);

            if (page != null)
            {
                var requestServices           = filterContext.HttpContext.RequestServices;
                var eventManager              = requestServices.GetService <IEventManager>();
                var layoutService             = requestServices.GetService <ILayoutService>();
                var widgetService             = requestServices.GetService <IWidgetBasePartService>();
                var applicationSettingService = requestServices.GetService <IApplicationSettingService>();
                var themeService              = requestServices.GetService <IThemeService>();
                var widgetActivator           = requestServices.GetService <IWidgetActivator>();
                var ruleService = requestServices.GetService <IRuleService>();
                var logger      = requestServices.GetService <ILogger <WidgetAttribute> >();
                var viewResult  = (filterContext.Result as ViewResult);

                LayoutEntity layout = layoutService.GetByPage(page);
                layout.Page  = page;
                page.Favicon = applicationSettingService.Get(SettingKeys.Favicon, "~/favicon.ico");
                if (filterContext.HttpContext.User.Identity.IsAuthenticated && page.IsPublishedPage)
                {
                    layout.PreViewPage = requestServices.GetService <IPageService>().Get(page.ReferencePageID);
                }
                layout.CurrentTheme = themeService.GetCurrentTheme();
                layout.ZoneWidgets  = new ZoneWidgetCollection();
                widgetService.GetAllByPage(page).Each(widget =>
                {
                    if (widget != null)
                    {
                        DateTime startTime           = DateTime.Now;
                        IWidgetPartDriver partDriver = widgetActivator.Create(widget);
                        object viewModel             = partDriver.Display(new WidgetDisplayContext
                        {
                            PageLayout    = layout,
                            ActionContext = filterContext,
                            Widget        = widget,
                            FormModel     = viewResult?.Model
                        });
                        WidgetViewModelPart part = new WidgetViewModelPart(widget, viewModel);
                        logger.LogInformation("{0}.Display(): {1}ms", widget.ServiceTypeName, (DateTime.Now - startTime).TotalMilliseconds);
                        if (part != null)
                        {
                            if (layout.ZoneWidgets.ContainsKey(part.Widget.ZoneID ?? UnknownZone))
                            {
                                layout.ZoneWidgets[part.Widget.ZoneID ?? UnknownZone].TryAdd(part);
                            }
                            else
                            {
                                layout.ZoneWidgets.Add(part.Widget.ZoneID ?? UnknownZone, new WidgetCollection {
                                    part
                                });
                            }
                        }
                        partDriver.Dispose();
                    }
                });

                var ruleWorkContext = new RuleWorkContext
                {
                    Url         = (filterContext.Controller as Controller).Url.Content(page.Url),
                    QueryString = filterContext.HttpContext.Request.QueryString.ToString(),
                    UserAgent   = filterContext.HttpContext.Request.Headers["User-Agent"]
                };
                var rules   = ruleService.GetMatchRule(ruleWorkContext);
                var ruleDic = rules.ToDictionary(m => m.RuleID, m => m);
                var rulesID = rules.Select(m => m.RuleID).ToArray();
                if (rules.Any())
                {
                    widgetService.GetAllByRule(rulesID, !IsPreView(filterContext)).Each(widget =>
                    {
                        if (widget != null)
                        {
                            DateTime startTime           = DateTime.Now;
                            IWidgetPartDriver partDriver = widgetActivator.Create(widget);
                            object viewModel             = partDriver.Display(new WidgetDisplayContext
                            {
                                PageLayout    = layout,
                                ActionContext = filterContext,
                                Widget        = widget,
                                FormModel     = viewResult?.Model
                            });
                            WidgetViewModelPart part = new WidgetViewModelPart(widget, viewModel);
                            logger.LogInformation("{0}.Display(): {1}ms", widget.ServiceTypeName, (DateTime.Now - startTime).TotalMilliseconds);
                            if (part != null)
                            {
                                var availableZones = layout.Zones.Where(z => ruleDic[widget.RuleID.Value].ZoneNames.Contains(z.ZoneName));
                                foreach (var zone in availableZones)
                                {
                                    part.Widget.SetZone(zone.HeadingCode);
                                    if (layout.ZoneWidgets.ContainsKey(zone.HeadingCode ?? UnknownZone))
                                    {
                                        layout.ZoneWidgets[zone.HeadingCode ?? UnknownZone].TryAdd(part);
                                    }
                                    else
                                    {
                                        layout.ZoneWidgets.Add(zone.HeadingCode ?? UnknownZone, new WidgetCollection {
                                            part
                                        });
                                    }
                                }
                            }
                            partDriver.Dispose();
                        }
                    });
                }

                if (viewResult != null)
                {
                    layout.Layout = GetLayout(filterContext, layout.CurrentTheme);
                    if (GetPageViewMode() == PageViewMode.Design)
                    {
                        layout.Templates = widgetService.Get(m => m.IsTemplate == true);
                    }
                    (filterContext.Controller as Controller).ViewData.Model = layout;
                }
                eventManager.Trigger(Events.OnPageExecuted, layout);

                layoutService.Dispose();
                applicationSettingService.Dispose();
                widgetService.Dispose();
                themeService.Dispose();
            }
            else
            {
                if (!(filterContext.Result is RedirectResult))
                {
                    var viewResult = filterContext.Result as ViewResult;
                    if (viewResult != null)
                    {
                        viewResult.StatusCode = 404;
                        viewResult.ViewName   = "NotFound";
                    }
                    else
                    {
                        filterContext.Result = new RedirectResult("~/error/notfond?f=" + filterContext.HttpContext.Request.Path);
                    }
                }
            }
        }