私は自分の解決策に入る前にバンドルが最初のヒット時に作成され、再利用されることを覚えておいてください。つまり、ダイナミックなスクリプトはまだグローバルでなければなりません。特定のユーザーに依存するなど)。これは一般的に静的なjsファイルのみを許可する理由です。そうだと思いますが、バージョン番号などの変数を自分のjsに入れたいと思うかもしれません(その場合は、私は個人的にAjax/JSONを使用します)。
私はそれについて行く方法は、Bundleから派生型を作成することだと思います。その中で、EnumerateFilesメソッドを上書きします。最初は、base.EnumerateFilesを列挙し、独自の仮想ファイルを組み込みます。以下のような
何か(注意:コードをテストしていません):
public class VirtualMethodBundle : Bundle
{
private List<VirtualFile> _virtualContent = new List<VirtualFile>();
public override IEnumerable<VirtualFile> EnumerateFiles(BundleContext context)
{
foreach(var file in base.EnumerateFiles(context))
{
yield return file;
}
foreach(var virtual in _virtualContent)
{
yield return virtual;
}
}
public void AddCustomFile(VirtualFile file)
{
_virtualContent.Add(method);
}
}
次に[開く/名前のメソッドをオーバーライドして...そこのようなものを、あなたの動的なコンテンツを返す特殊なVirtualFile定義された型を持っているでしょう。
public class MethodBasedVirtualFile : VirtualFile
{
private readonly Func<string> _contentFactory;
private readonly string _path;
public MethodBasedVirtualFile(string path, Func<string> contentFactory)
{
_path = path;
_contentFactory = contentFactory;
}
public override string Name { get { return _path; } }
public override Stream Open()
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(_contentFactory());
writer.Flush();
stream.Position = 0;
return stream;
}
}
それでは、それをあなたが持っているでしょう、すべてを使用するように...
var bundle = new VirtualMethodBundle();
bundle.Include(... real files ...);
bundle.AddCustomFile(
new MethodBasedVirtualFile("~/DynamicScript/UrlDictionary",
... the method that creates the content of that script...)
);
あなたは賢いした場合、あなただけのURLパスを受け取り、自動的にコンテンツを取得するためにMVCを使用していますUrlVirtualFileを作ることができます必須。
あなたはEnumerateFiles()戻り値の型をオーバーライドしている、それは IEnumerableを IEnumerableをではありません。コードはコンパイルされません。 –