public static MvcHtmlString WriteScripts(this HtmlHelper htmlHelper, string area = null)
        {
            const ScriptType type = ScriptType.JavaScript;

            var catAppSetting = ConfigurationManager.AppSettings["SJ.Concatenate"];
            bool concatenate = catAppSetting != null && bool.Parse(catAppSetting);

            if (concatenate)
            {
                var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
                string url = urlHelper.Content("~/ScriptManager/" + type.ToString() + "/" + area);

                var builder = new TagBuilder("script");
                builder.Attributes.Add("type", "text/javascript");
                builder.Attributes.Add("src", url);

                return new MvcHtmlString(builder.ToString(TagRenderMode.Normal));
            }
            else
            {
                var manager = new ScriptManager();

                string output = "";

                foreach (var item in manager.ListForType(type).ScriptsForArea(area))
                {
                    var builder = new TagBuilder("script");
                    builder.Attributes.Add("type", "text/javascript");

                    if (!item.IsInline)
                    {
                        builder.Attributes.Add("src", item.Url);
                    }
                    else
                    {
                        builder.InnerHtml = String.Format("/* {0} */\n", item.UniqueKey) + item.Source;
                    }

                    output += new MvcHtmlString(builder.ToString(TagRenderMode.Normal)) + "\n";
                }

                return new MvcHtmlString(output);
            }
        }
        public void ScriptManager_ListForType_Creates_New_ScriptFileList_Test()
        {
            var cacheManager = new Mock<ICacheManager>();
            var contextAccessor = new Mock<IHttpContextAccessor>();
            var list = new Mock<IScriptFileList>();
            var items = new Dictionary<string, object>();
            items.Add("__sm__Stylesheet", list.Object);

            var context = new Mock<HttpContextBase>
            {
                DefaultValue = DefaultValue.Mock
            };

            contextAccessor.Setup(c => c.Current()).Returns(context.Object);
            context.SetupGet(c => c.Items).Returns(items);

            var target = new ScriptManager(cacheManager.Object, contextAccessor.Object);

            var type = ScriptType.JavaScript;
            IScriptFileList actual;

            actual = target.ListForType(type);
            Assert.IsNotNull(actual);
        }
        public void ScriptManager_ListForType_Returns_Existing_ScriptFileList_Test()
        {
            var cacheManager = new Mock<ICacheManager>();
            var contextAccessor = new Mock<IHttpContextAccessor>();
            var list = new Mock<IScriptFileList>();

            var context = new Mock<HttpContextBase>
            {
                DefaultValue = DefaultValue.Mock
            };

            contextAccessor.Setup(c => c.Current()).Returns(context.Object);
            context.SetupGet(c => c.Application["__sm__JavaScript"]).Returns(() => list.Object);

            var target = new ScriptManager(cacheManager.Object, contextAccessor.Object);

            context.Object.Items["__sm__JavaScript"] = list.Object;

            var type = ScriptType.JavaScript;
            IScriptFileList actual;

            actual = target.ListForType(type);
            Assert.IsNotNull(actual);
            Assert.AreSame(list.Object, actual);
        }
        public static MvcHtmlString WriteStyles(this HtmlHelper htmlHelper, string area = null)
        {
            var type = ScriptType.Stylesheet;

            var catAppSetting = ConfigurationManager.AppSettings["SJ.Concatenate"];
            bool concatenate = catAppSetting != null && bool.Parse(catAppSetting);

            if (concatenate)
            {
                var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
                string url = urlHelper.Content("~/ScriptManager/" + type.ToString() + "/" + area);

                var builder = new TagBuilder("link");
                builder.Attributes.Add("type", "text/css");
                builder.Attributes.Add("rel", "stylesheet");
                builder.Attributes.Add("href", url);

                return new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing));
            }
            else
            {
                var manager = new ScriptManager();

                string output = "";

                foreach (var item in manager.ListForType(type).ScriptsForArea(area))
                {
                    if (!item.IsInline)
                    {
                        var builder = new TagBuilder("link");
                        builder.Attributes.Add("type", "text/css");
                        builder.Attributes.Add("rel", "stylesheet");
                        builder.Attributes.Add("href", item.Url);

                        output += builder.ToString(TagRenderMode.SelfClosing) + "\n";
                    }
                    else
                    {
                        var builder = new TagBuilder("style");
                        builder.Attributes.Add("type", "text/css");
                        builder.InnerHtml = item.Source;
                        output += builder.ToString(TagRenderMode.Normal) + "\n";
                    }
                }

                return new MvcHtmlString(output);
            }
        }