ASP.NET MVC:StyleBundle IncludeDirectory & CssRewriteUrlTransform
ASP.NET MVC: StyleBundle IncludeDirectory & CssRewriteUrlTransform
我和很多人一样遇到同样的问题,当我捆绑我的 CSS-样式表时,我的图像没有被解析。
现在我发现一些 SO-Answers 建议使用 new CssRewriteUrlTransform()
作为新 StyleBundle-Object 的 "Include"-Method 的第二个参数。 This one for example
我正在使用 IncludeDirectory,因为我有一个目录,我可以在其中添加文件而无需将它们注册到某个地方(而且它们有很多我不想列出的文件)。但是 IncludeDirectory 没有覆盖传递 CssRewriteUrlTransform-Object:
无效: bundles.Add(new StyleBundle("~/bundles/css/directives").IncludeDirectory("~/app/directives", "*.css", true));
我也试过了:
StyleBundle sb = new StyleBundle();
sb.Transforms.Add(new CssRewriteUrlTransform());
但是转换属于 IBundleTransform 类型,我正在尝试传递 IItemTransform。
关于如何做到这一点有什么建议吗?
由于我没有找到更好的答案,我将 post 我的解决方案(感觉更像是一种解决方法):
public class BundleConfig {
private class CssRewriteUrlTransformWrapper : IItemTransform {
public string Process(string includedVirtualPath, string input) {
//see
return new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);
}
}
private static string MakeVirtualPath(string fromPhysPath, string withVirtualPath) {
var res = fromPhysPath.Replace("\", "/");
var idx = res.IndexOf(withVirtualPath.Replace("~", ""));
res = "~" + res.Substring(idx);
return res;
}
private static StyleBundle CreateStyleBundleForDir(string virtualPath) {
StyleBundle res = new StyleBundle(virtualPath + "/bundle");
string[] cssFilesPhysical = Directory.GetFiles(HttpContext.Current.Server.MapPath(virtualPath), "*.css", SearchOption.AllDirectories);
List<string> cssFilesVirtual = new List<string>();
foreach (var file in cssFilesPhysical) {
res.Include(MakeVirtualPath(file, virtualPath), new CssRewriteUrlTransformWrapper());
}
return res;
}
public static void RegisterBundles(BundleCollection bundles) {
bundles.Add(CreateStyleBundleForDir("~/app/custom"));
}
}
我愿意接受建设性的批评:)
将此扩展方法添加到 BundleConfig 并将其用作
new StyleBundle("~/Bundles/all.css")
.InclDir("~/WebResources/libref/minton/css", "*.css");
代码:
private static void InclDir(this StyleBundle bundles, string virtualPath, string pattern, bool includeSubDir = false)
{
var vpath = virtualPath.TrimEnd('/');
var ppath = HttpContext.Current.Server.MapPath(vpath);
var files = Directory.GetFiles(ppath, pattern, includeSubDir ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
foreach (var file in files)
{
var vfp = virtualPath + "/" + file.Substring(ppath.Length + 1).Replace("\", "/");
bundles.Include(vfp, new CssRewriteUrlTransform());
}
我和很多人一样遇到同样的问题,当我捆绑我的 CSS-样式表时,我的图像没有被解析。
现在我发现一些 SO-Answers 建议使用 new CssRewriteUrlTransform()
作为新 StyleBundle-Object 的 "Include"-Method 的第二个参数。 This one for example
我正在使用 IncludeDirectory,因为我有一个目录,我可以在其中添加文件而无需将它们注册到某个地方(而且它们有很多我不想列出的文件)。但是 IncludeDirectory 没有覆盖传递 CssRewriteUrlTransform-Object:
无效: bundles.Add(new StyleBundle("~/bundles/css/directives").IncludeDirectory("~/app/directives", "*.css", true));
我也试过了:
StyleBundle sb = new StyleBundle();
sb.Transforms.Add(new CssRewriteUrlTransform());
但是转换属于 IBundleTransform 类型,我正在尝试传递 IItemTransform。
关于如何做到这一点有什么建议吗?
由于我没有找到更好的答案,我将 post 我的解决方案(感觉更像是一种解决方法):
public class BundleConfig {
private class CssRewriteUrlTransformWrapper : IItemTransform {
public string Process(string includedVirtualPath, string input) {
//see
return new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);
}
}
private static string MakeVirtualPath(string fromPhysPath, string withVirtualPath) {
var res = fromPhysPath.Replace("\", "/");
var idx = res.IndexOf(withVirtualPath.Replace("~", ""));
res = "~" + res.Substring(idx);
return res;
}
private static StyleBundle CreateStyleBundleForDir(string virtualPath) {
StyleBundle res = new StyleBundle(virtualPath + "/bundle");
string[] cssFilesPhysical = Directory.GetFiles(HttpContext.Current.Server.MapPath(virtualPath), "*.css", SearchOption.AllDirectories);
List<string> cssFilesVirtual = new List<string>();
foreach (var file in cssFilesPhysical) {
res.Include(MakeVirtualPath(file, virtualPath), new CssRewriteUrlTransformWrapper());
}
return res;
}
public static void RegisterBundles(BundleCollection bundles) {
bundles.Add(CreateStyleBundleForDir("~/app/custom"));
}
}
我愿意接受建设性的批评:)
将此扩展方法添加到 BundleConfig 并将其用作
new StyleBundle("~/Bundles/all.css")
.InclDir("~/WebResources/libref/minton/css", "*.css");
代码:
private static void InclDir(this StyleBundle bundles, string virtualPath, string pattern, bool includeSubDir = false)
{
var vpath = virtualPath.TrimEnd('/');
var ppath = HttpContext.Current.Server.MapPath(vpath);
var files = Directory.GetFiles(ppath, pattern, includeSubDir ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
foreach (var file in files)
{
var vfp = virtualPath + "/" + file.Substring(ppath.Length + 1).Replace("\", "/");
bundles.Include(vfp, new CssRewriteUrlTransform());
}