如何在ASP.NET中提取Style或Javascript Bundle的输出

时间:2014-05-05 06:57:03

标签: asp.net css asp.net-mvc bundling-and-minification

我正在开发一个单页应用,它在.cshtml文件中使用CSS包,如下所示:

@ Styles.Render("〜/内容/ CSS /束-CSS&#34)

但是,为了提高网站的加载性能,我想将整个捆绑并缩小的CSS嵌入到我的.cshtml文件中。所以我想将上面的代码转换为:

@ Html.GetInternalCss("〜/内容/ CSS /束-CSS&#34);

其中GetInternalCss是一种扩展方法,它将获取css虚拟路径并输出内部css。代码如下所示:

    public static MvcHtmlString GetInternalCss(this HtmlHelper html, string styleBundleVirtualPath)
    {
        //TODO:
        var bundledCss = "How do I extract the css from the virtual path?";

        var internalCss = string.Format("<style>{0}</style>", bundledCss);

        return new MvcHtmlString(internalCss);


    }

我知道捆绑的css在内存中。我只需要知道如何解决它。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我可能已用以下代码回答了我自己的问题:

    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.Net;
    using System.Web.Mvc;
    using System.Web.Optimization;

    namespace SomeNameSpace
    {

        public static class HtmlHelpExtensions
        {
            private static readonly IDictionary<string,string> InternalCssCache = new ConcurrentDictionary<string, string>(); 

            public static MvcHtmlString GetInternalCss(this HtmlHelper html, string styleBundleVirtualPath)
            {
                string internalCss = null;
                if (InternalCssCache.TryGetValue(styleBundleVirtualPath, out internalCss))
                    return new MvcHtmlString(internalCss);

                //download the css
                var relativeUrl = Styles.Url(styleBundleVirtualPath);
                var url = html.ViewContext.HttpContext.Request.Url + relativeUrl.ToString().Trim('/');
                var webClient = new WebClient();
                var css = webClient.DownloadString(url);

                internalCss = string.Format("<style>{0}</style>", css);
                InternalCssCache[styleBundleVirtualPath] = internalCss;

                return new MvcHtmlString(internalCss);
            }
        }

    }