如何禁用ASP.NET MVC 4 Beta中的Javascript/CSS缩小测试版
我只是尝试ASP.NET MVC 4,但我无法弄清楚如何禁用Javascript/CSS缩小功能。尤其对于开发环境来说,这对调试起到很大帮助。我可以想象它会是web.config中的一个开关,但是由于ASP.NET MVC 4目前还处于测试阶段,因此实际上没有太多信息。希望如果有人能够帮助或指向正确的博客文章等如何禁用ASP.NET MVC 4 Beta中的Javascript/CSS缩小测试版
在Global.asax.cs中
#if DEBUG
foreach (var bundle in BundleTable.Bundles)
{
bundle.Transform = new NoTransform();
}
#endif
现在已经在最新版本中更改,请参阅此答案的详细信息:http://stackoverflow.com/a/11270224 – Michael 2012-08-03 00:09:38
@迈克尔:是的,但答案是正确的*为beta *作为OP请求:-)我仍然有一个MVC 4测试版网站尚未升级,很高兴我找到了这个答案:-) – 2013-02-07 03:18:55
另一种选择将创建一个HTML助手,你可以用它来建立脚本和链接标签。以下是我已经为JavaScript的,这也可以为CSS进行实施:
public static class BundleHelper
{
public static MvcHtmlString JsBundle(this HtmlHelper helper, string bundlePath)
{
var jsTag = new TagBuilder("script");
jsTag.MergeAttribute("type", "text/javascript");
return ReferenceBundle(helper, bundlePath, jsTag);
}
public static MvcHtmlString ReferenceBundle(this HtmlHelper helper, string bundlePath, TagBuilder baseTag)
{
var httpContext = helper.ViewContext.HttpContext;
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlePath);
var htmlString = new StringBuilder();
if (bundle != null)
{
var bundleContext = new BundleContext(helper.ViewContext.HttpContext, BundleTable.Bundles, urlHelper.Content(bundlePath));
if (!httpContext.IsDebuggingEnabled)
{
baseTag.MergeAttribute("href", System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(bundlePath));
return new MvcHtmlString(baseTag.ToString());
}
foreach (var file in bundle.EnumerateFiles(bundleContext))
{
var basePath = httpContext.Server.MapPath("~/");
if (file.FullName.StartsWith(basePath))
{
var relPath = urlHelper.Content("~/" + file.FullName.Substring(basePath.Length));
baseTag.MergeAttribute("href", relPath, true);
htmlString.AppendLine(baseTag.ToString());
}
}
}
return new MvcHtmlString(htmlString.ToString());
}
}
现在,所有你需要做的就是把它在你的观点:
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - My ASP.NET MVC Application</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="~/Content/css" rel="stylesheet" type="text/css" />
<link href="~/Content/themes/base/css" rel="stylesheet" type="text/css" />
@Html.JsBundle("~/scripts/js")
<meta name="viewport" content="width=device-width" />
</head>
,它会根据web.config中的调试设置将脚本渲染为单独的引用,或使用新的捆绑/缩小功能。如果你想看更多的例子,我使用http://codecutout.com/resource-minify-bundling的一些代码作为创建助手的参考。他们的帮手写的更好一些,当提供无效参数时抛出异常,等等......我还没有到处去清理我的。
如果您不希望内容被缩小,您可以在Global.asax中注册自己的包并使用NoTransform
类。
我个人不希望我的脚本被转换。我只是创建两个脚本目录。一个带有调试脚本版本,另一个带有最初下载的缩小版本。
MVC 4开箱即用缩小器(JsMinify)为Opera打破了jQuery 1.7.1,所以我不想使用那个。我只是把下面几行,我的Global.asax:Application_Start()
方法:
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/DebugScripts")" type="text/javascript"></script>
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/ProductionScripts")" type="text/javascript"></script>
当然:
Bundle debugScripts = new Bundle("~/DebugScripts",
new NoTransform("text/javascript"));
debugScripts.AddDirectory("~/Scripts/Debug", "*.js");
BundleTable.Bundles.Add(debugScripts);
Bundle productionScripts = new Bundle("~/ProductionScripts",
new NoTransform("text/javascript"));
productionScripts.AddDirectory("~/Scripts/Minified", "*.js");
BundleTable.Bundles.Add(productionScripts);
随着在地方,我可以简单地添加的两行我_layouts.cshtml
一方我们可以在这个地方得到更多时髦。我们只能生成一个包,并根据构建的类型选择要包含的文件。
在Global.asax中调用EnableDefaultBundles()
,你可以做到这一点之后......
if (... running in development environment ...)
{
var registeredBundles = BundleTable.Bundles.GetRegisteredBundles();
foreach (var bundle in registeredBundles)
{
if (bundle.Transform is System.Web.Optimization.JsMinify)
bundle.Transform = new NoTransform();
}
}
不算漂亮(修改状态由系统设置),但它比所有其他建议代码少了很多,仍然允许您使用标准绑定行为,并且不会对您的视图进行任何更改。
我认为这是正确的,如果这样的功能将可“开箱即用”。
我贴在UserVoice.com反馈:http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle
给它你的 “声音”。
尝试System.Web.Optimization的新扩展 - Bundle Transformer。 Bundle Transformer实施了许多简化调试的机会(请参阅documentation)。
与其替换JsMinify和CssMinify的实例,可以改为使用接口。 此选项在早期版本中不可用,因为第二个构造函数参数是类型而不是接口。
IBundleTransform jsTransform;
IBundleTransform cssTransform;
#if DEBUG
jsTransform = new NoTransform("text/javascript");
cssTransform = new NoTransform("text/css");
#else
jsTransform = new JsMinify();
cssTransform = new CssMinify();
#endif
Bundle jsBundle = new Bundle("~/JsB", jsTransform);
Bundle cssBundle = new Bundle("~/CssB", cssTransform);
或许也值得一提,对于附带例如微细化以及非精缩版脚本jQuery的,可以使用一个辅助方法任选带出 “.min” 为DEBUG构建便于调试:
private string Min(string scriptNameIncludingMin)
{
#if DEBUG
return scriptNameIncludingMin.Replace(".min", ""); // Remove .min from debug builds
#else
return scriptNameIncludingMin;
#endif
}
// ...
jsBundle.AddFile(Min("~/Scripts/jquery-1.7.2.min.js"));
这是否停止js连接以及缩小?它也烦人的调试一个巨大的js文件。 – Alex 2012-05-30 06:28:50
可以从配置将其关闭:
<system.web>
<compilation debug="true" />
<!-- Lines removed for clarity. -->
</system.web>
http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification
另一种替代方法(带v1.1.0.0和MVC5测试):
public class BundleConfig
{
public static void Register()
{
ScriptBundle jsBundle = new ScriptBundle("~/Scripts/myscript.min.js");
jsBundle.Include("~/Scripts/myscript.js");
DisableInDebugMode(jsBundle);
BundleTable.Bundles.Add(jsBundle);
}
private static void DisableInDebugMode(ScriptBundle jsBundle)
{
#if DEBUG
// Don't minify in debug mode
jsBundle.Transforms.Clear();
#endif
}
}
论的新版本ASP.NET MVC只需添加
#if DEBUG
foreach (var bundle in BundleTable.Bundles)
{
bundle.Transforms.Clear();
}
#endif
后
BundleConfig.RegisterBundles(...);
只是我的权利,或者是很可笑,这不是一个配置设置? – Jordan 2012-03-26 17:54:37
@Jeff:Ruby on Rails有其自身的局限性,就像每个平台一样。 – 2012-04-19 17:34:49