有没有办法使用 MVC4 中的新捆绑功能捆绑单个文件?我知道捆绑单个文件没有多大意义,但我想使用服务器端缩小并让 MVC 将哈希附加到 URL 的末尾以用于缓存目的。
我已经尝试过,@Scripts.Url("~/Scripts/myscript.js")
但它似乎不起作用。
有没有办法使用 MVC4 中的新捆绑功能捆绑单个文件?我知道捆绑单个文件没有多大意义,但我想使用服务器端缩小并让 MVC 将哈希附加到 URL 的末尾以用于缓存目的。
我已经尝试过,@Scripts.Url("~/Scripts/myscript.js")
但它似乎不起作用。
好吧,在你的包配置中定义一个只包含这个文件的包:
bundles.Add(
new ScriptBundle("~/bundles/myscript").Include("~/Scripts/myscript.js")
);
然后通过按名称引用它在您的视图中使用它:
@Scripts.Render("~/bundles/myscript")
我需要这样的东西,这就是我想出的
在视图上,我可以使用 HTML Helper 添加脚本或样式。这些都将接受 n 个参数。
@Html.Style("~/Styles/someFile.css")
@Html.Script("~/Scripts/foo.js", "~/Scripts/bar.js")
所以我创建了一个扩展来为我处理这个问题。这是班级的样子。
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());
}
}
}
这会在捆绑“虚拟目录”存在的地方进行硬编码。因此,如果您的文件中有任何图像或其他任何内容的相对路径,它们就会中断。对于我们的用例,这对我们来说现在很好。
捆绑包名称是自动生成的。同样,这对我们有用,但可能会更好。我可以看到一个简单的改进,您必须提供一个包路径和名称,其语法如下:@Html.Script("~/bundles/myBundleName","~/Scripts/foo.js", "~/Scripts/bar.js")
我很高兴听到任何人可能对此进行的任何改进。
我不知道,如果我说得对,但是您可以随时添加捆绑包,只需将其添加到捆绑包集合中:
BundleTable.Bundles.Add(new ScriptBundle("~/Scripts/myBundleName").Include(
"~/Scripts/myscript.js"
));
我不确定您打算如何在客户端包含捆绑包,但是在注册捆绑包后,您可以使用以下代码获取缩小脚本文件的 url:
string url = BundleTable.Bundles.ResolveBundleUrl("~/Scripts/myBundleName");
就我而言,我只是通过 ajax 请求获取此 url 并在客户端创建一个脚本标记。这样脚本文件将被缩小,并且 url 带有一个哈希码,因此浏览器应该缓存它,并且当包被更改时应该加载更新的版本。
我希望这是你打算做的。