Untitled
csharp
posted: Feb, 15th 2012 | jump to bottom
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Text; using System.Web.WebPages; namespace StackOverflow.Helpers { public static class DeferJS { const string builderKey = "SCRIPT_BUILDER"; const string builderEnabledKey = "SCRIPT_BUILDER_ENABLED"; class ScriptBuilder { List<string> LayoutScripts = new List<string>(); List<string> Scripts = new List<string>(); bool layoutStarted = false; public void Add(string script) { if (layoutStarted) { LayoutScripts.Add(script); } else { Scripts.Add(script); } } public void MarkLayoutStart() { // once the template starts we need to add scripts to a second list, templates are rendered after internal views layoutStarted = true; } public void MarkLayoutBodyRendered() { layoutStarted = false; } public string ToString() { return string.Join("", LayoutScripts) + string.Join("", Scripts); } } public static bool Enabled { get { return (bool?)HttpContext.Current.Items[builderEnabledKey] == true; } set { HttpContext.Current.Items[builderEnabledKey] = value; } } private static ScriptBuilder GetScriptBuilder() { var builder = HttpContext.Current.Items[builderKey] as ScriptBuilder; if (builder == null) { HttpContext.Current.Items[builderKey] = builder = new ScriptBuilder(); } return builder; } public static HelperResult AppendJs(this WebPageBase page, Func<object, HelperResult> stuff) { if (Enabled) { var builder = GetScriptBuilder(); builder.Add(stuff(null).ToHtmlString()); return new HelperResult(_ => {}); } else { return stuff(null); } } public static IHtmlString AppendJs(this WebPageBase page, IHtmlString stuff) { if (Enabled) { var builder = GetScriptBuilder(); builder.Add(stuff.ToString()); return "".AsHtml(); } else { return stuff; } } public static void MarkLayoutStart() { if (Enabled) { GetScriptBuilder().MarkLayoutStart(); } } // called when the body is done rendering public static void MarkLayoutBodyRendered() { if (Enabled) { GetScriptBuilder().MarkLayoutBodyRendered(); } } public static IHtmlString RenderJs(this WebPageBase page) { if (Enabled) { return new MvcHtmlString(GetScriptBuilder().ToString()); } else { return "".AsHtml(); } } } }
338 views




