Ejemplo n.º 1
0
        public void OnResultExecuted(ResultExecutedContext filterContext)
        {
            ResponseFilter responseFilter = filterContext.HttpContext.Response.Filter as ResponseFilter;

            if (responseFilter != null)
            {
                UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);

                foreach (PluginTemplate pluginTemplate in pluginTemplateRegistry)
                {
                    if (pluginTemplate.ForCurrentRequest(new PluginTemplateContext(filterContext)))
                    {
                        PluginTemplate template = pluginTemplate;

                        switch (pluginTemplate.SelectorType)
                        {
                        case PluginTemplateSelectorType.ReplaceWith:
                            responseFilter.Inserts.Add(new ResponseInsert(i => renderPluginTemplate(template, filterContext, template.ModelTarget, i), ResponseInsertMode.ReplaceWith, pluginTemplate.Selector));
                            break;

                        case PluginTemplateSelectorType.InsertBefore:
                            responseFilter.Inserts.Add(new ResponseInsert(i => renderPluginTemplate(template, filterContext, template.ModelTarget, i), ResponseInsertMode.InsertBefore, pluginTemplate.Selector));
                            break;

                        case PluginTemplateSelectorType.InsertAfter:
                            responseFilter.Inserts.Add(new ResponseInsert(i => renderPluginTemplate(template, filterContext, template.ModelTarget, i), ResponseInsertMode.InsertAfter, pluginTemplate.Selector));
                            break;

                        case PluginTemplateSelectorType.PrependTo:
                            responseFilter.Inserts.Add(new ResponseInsert(i => renderPluginTemplate(template, filterContext, template.ModelTarget, i), ResponseInsertMode.PrependTo, pluginTemplate.Selector));
                            break;

                        case PluginTemplateSelectorType.AppendTo:
                            responseFilter.Inserts.Add(new ResponseInsert(i => renderPluginTemplate(template, filterContext, template.ModelTarget, i), ResponseInsertMode.AppendTo, pluginTemplate.Selector));
                            break;
                        }
                    }
                }

                foreach (PluginStyle style in pluginStyleRegistry)
                {
                    if (style.ForCurrentRequest(new PluginStyleContext(filterContext)))
                    {
                        responseFilter.Inserts.Add(new ResponseInsert(i => string.Format("<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />", urlHelper.PluginStylesPath(style.Plugin, style.Url)), ResponseInsertMode.AppendTo, "head"));
                    }
                }

                foreach (PluginScript script in pluginScriptRegistry)
                {
                    if (script.ForCurrentRequest(new PluginScriptContext(filterContext)))
                    {
                        responseFilter.Inserts.Add(new ResponseInsert(i => string.Format("<script src=\"{0}\" type=\"text/javascript\"></script>", urlHelper.PluginScriptsPath(script.Plugin, script.Url)), ResponseInsertMode.AppendTo, "head"));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private static string renderPluginTemplate(PluginTemplate pluginTemplate, ResultExecutedContext context, string partialView, int index)
        {
            ViewPage viewPage = new ViewPage()
            {
                ViewContext = new ViewContext(context, ((ViewResult)context.Result).View, context.Controller.ViewData, context.Controller.TempData), ViewData = context.Controller.ViewData
            };
            StringBuilder sb = new StringBuilder();

            viewPage.InitHelpers();

            //TODO: (erikpo) Change the current model to be wrapped by a PluginViewModel to strongly type things like the plugin and its extended properties
            viewPage.ViewData.Model     = getModel(context, partialView, index);
            viewPage.ViewData["Plugin"] = pluginTemplate.Plugin;
            viewPage.ViewData["Index"]  = index;
            viewPage.Controls.Add(viewPage.LoadControl(string.Format("{0}/{1}.ascx", pluginTemplate.Plugin.Container.GetTemplatesPath(), pluginTemplate.TemplateName)));

            using (StringWriter sw = new StringWriter(sb))
                using (HtmlTextWriter tw = new HtmlTextWriter(sw))
                    viewPage.RenderControl(tw);

            return(sb.ToString());
        }