これは非常に実行可能だと思いますが、解決策に入る前に、最初のヒットでバンドルが作成され、再利用されることを思い出してください。つまり、「動的」スクリプトはすべてグローバルである必要があります (つまり、特定のユーザーなど)。これが、一般に静的 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);
}
}
次に、Open/Name メソッドをオーバーライドし、そこに動的コンテンツを返す特別な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 を作成できます。