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 ヘルパーを使用してスクリプトまたはスタイルを追加できます。これらはそれぞれ 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 にはハッシュ コードが含まれているため、ブラウザはそれをキャッシュし、バンドルが変更されたときに新しいバージョンをロードする必要があります。
これがあなたの意図したことであることを願っています。