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")); } } } }
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()); }