ASP.NET MVC4捆绑单个文件

eth*_*th0 9 asp.net asp.net-mvc-4 bundling-and-minification

有没有办法使用MVC4中的新捆绑功能捆绑单个文件?我知道捆绑单个文件没有多大意义但是我想使用服务器端缩小,并让MVC在URL的末尾添加一个哈希值以用于缓存目的.

我试过了,@Scripts.Url("~/Scripts/myscript.js")但似乎不起作用.

Dar*_*rov 7

好吧,在bundle config中定义一个只包含这个文件的bundle:

bundles.Add(
    new ScriptBundle("~/bundles/myscript").Include("~/Scripts/myscript.js")
);
Run Code Online (Sandbox Code Playgroud)

然后通过名称引用它在视图中使用它:

@Scripts.Render("~/bundles/myscript")
Run Code Online (Sandbox Code Playgroud)

  • 因为我们的网站非常动态,我们有数百种不同的白色标签/皮肤,每个"皮肤"都有一堆Javascript文件每天都在变化.设法将每个CSS/JS文件放在`AppStart`中将是一场噩梦 (2认同)

CBa*_*arr 5

我需要这样的东西,这就是我想出的东西

在视图中,我可以使用HTML Helper添加脚本或样式.这些将接受n个参数.

@Html.Style("~/Styles/someFile.css")
@Html.Script("~/Scripts/foo.js", "~/Scripts/bar.js")
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个扩展来为我处理这个问题.这是班级的样子.

using System.Linq;
using System.Web.Optimization;

namespace System.Web.Mvc
{
    public static class HtmlHelperExtensions
    {

        public static IHtmlString Script(this HtmlHelper helper, params string[] urls)
    {
        var bundleDirectory = "~/Scripts/bundles/" + MakeBundleName(".js", urls);
        var thisBundle = new ScriptBundle(bundleDirectory).Include(urls);
        BundleTable.Bundles.Add(thisBundle);

        return Scripts.Render(bundleDirectory);
    }

    public static IHtmlString Style(this HtmlHelper helper, params string[] urls)
    {
        var bundleDirectory = "~/Styles/bundles/" + MakeBundleName(".css", urls);
        var thisBundle = new StyleBundle(bundleDirectory).Include(urls);
        BundleTable.Bundles.Add(thisBundle);

        return Styles.Render(bundleDirectory);
    }

    private static string MakeBundleName(string type, params string[] urls)
    {
        var bundleSections = new List<string>();

        foreach (var item in urls)
        {
            bundleSections.Add(item.Replace("~/", "").Replace("/", ".").Replace(type, ""));
        }

        return string.Join("+", bundleSections.ToArray());
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意事项

这是捆绑"虚拟目录"存在的硬编码.因此,如果您有任何图像或文件中的任何其他相对路径,它们将会中断.对于我们的用例,这对我们来说现在很好.

捆绑包名称是自动生成的.同样,这对我们有用,但它可能会更好.我可以看到一个简单的改进,你必须提供一个包含这样的语法的包路径和名称:@Html.Script("~/bundles/myBundleName","~/Scripts/foo.js", "~/Scripts/bar.js")


我很高兴听到任何人可能对此有任何改进.