根据article I read earlier by Scott Guthrie和video posted by Mads Kristensen,我应该能够通过替换它来自动捆绑/缩小ASP.net MVC 4:
<link href="Styles/reset.css" rel="stylesheet" type="text/css" />
<link href="Styles/normalize.css" rel="stylesheet" type="text/css" />
<link href="Styles/styles.css" rel="stylesheet" type="text/css" />
<script src="Scripts/jquery-1.8.0.min.js" type="text/javascript"></script>
<script src="Scripts/jquery-validation.min.js" type="text/javascript"></script>
有了这个:
<link href="Styles/css" rel="stylesheet" type="text/css" />
<script src="Scripts/js" type="text/javascript"></script>
我已经尝试过针对.Net 4.0和4.5,它似乎没有什么区别。我收到404错误,链接和脚本标签从不针对捆绑资源。
此功能是否已从最终版本中删除?
我想将此功能用于“主题”。
这就是我最终实施的方式。希望它有意义......
/// <summary>
/// Render stylesheets HTML for the given theme. Utilizes System.Web.Optimization for bundling and minification
/// </summary>
/// <param name="themeName">Name of theme</param>
/// <returns>HtmlString containing link elements</returns>
public static IHtmlString RenderThemeStyles(string themeName)
{
IHtmlString retValue = null;
// If no theme name is passed, return null
if (!themeName.HasValue())
return retValue;
var ctxt = HttpContext.Current;
string themePath = "~/Themes/" + themeName;
string themeKey = themePath + "/css";
if (ctxt.Cache[themeKey] != null)
return (IHtmlString)ctxt.Cache[themeKey];
// Check to see if the theme directory exists. Throw error if it does not
string themeSysPath = HttpContext.Current.Server.MapPath(themePath);
DirectoryInfo themeDir = new DirectoryInfo(themeSysPath);
if (!themeDir.Exists)
throw new ApplicationException(string.Format("Theme directory \"{0}\" does not exist", themePath));
// Remove the old bundle if it already exists
var old_bundle = BundleTable.Bundles.FirstOrDefault(b => b.Path == themeKey);
if (old_bundle != null)
BundleTable.Bundles.Remove(old_bundle);
if (themeDir.GetFiles("*.css").Length > 0)
{
// If there are css files, add them to the bundler and save the rendered output to cache
Bundle styles = new StyleBundle(themeKey).IncludeDirectory(themePath, "*.css");
BundleTable.Bundles.Add(styles);
retValue = Styles.Render(themeKey);
ctxt.Cache.Insert(themeKey, retValue, new System.Web.Caching.CacheDependency(themeSysPath));
}
else
{
// If there are no css files, save empty string to cache
ctxt.Cache.Insert(themeKey, new HtmlString(string.Empty), new System.Web.Caching.CacheDependency(themeSysPath));
}
return retValue;
}
答案 0 :(得分:6)
是的,虽然我找不到RC发行说明,但MVC4 RC版本中删除了此功能。
Rick Anderson关于upgrade MVC4 beta to RC的博客文章描述了这个过程:
删除“自动捆绑”引用,并使用您的捆绑配置创建/复制BundleConfig.cs
,并使用BundleConfig.RegisterBundles(BundleTable.Bundles);
从Global.asax中调用它。
Hanselman提到了一些关于这个决定的backround info:
网络优化已经发生了一些重大变化 自beta以来(缩小和捆绑)框架。没有足够的 控制捆绑的内容以及测试版中的顺序,这样就可以了 被移入BundleConfig.cs(或.vb),你有总数 控制
答案 1 :(得分:6)
不完全正确,所以我们删除了EnableDefaultBundles
,这就是您所说的“自动捆绑”,但基础功能仍然存在。
您可以通过注册来执行与该方法相同的操作:
BundleTable.Bundles.Add(new DynamicFolderBundle("js", "*.js");
BundleTable.Bundles.Add(new DynamicFolderBundle("css", "*.css");
我们删除了该方法,因为这是一个相当有问题的方法,因为按字母排序通常不是所需的顺序。