ASP.NET MVC Bundle不在呈现服务器上呈现脚本文件。 它在开发服务器上工作
在我们的ASP.NET MVC 4 Web应用程序中,我们的BundleConfig.cs包含以下内容:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include( "~/Scripts/jquery-ui-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.unobtrusive*", "~/Scripts/jquery.validate*")); bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*"));
当我们在开发服务器上查看主页的html时,即使将web.config中的debugging模式设置为true,也可以看到以下脚本标记: <compilation debug="true" targetFramework="4.0" />
<script src="/AFR/Scripts/jquery-ui-1.8.20.min.js"></script> <script src="/AFR/Scripts/modernizr-2.5.3.js"></script> <script src="/AFR/Scripts/jquery-1.7.1.js"></script> <script src="/AFR/Scripts/jquery-ui-1.8.20.js"></script> <script src="/AFR/Scripts/jquery.unobtrusive-ajax.js"></script> <script src="/AFR/Scripts/jquery.validate.js"></script> <script src="/AFR/Scripts/jquery.validate.unobtrusive.js"></script>
但是,当我们在临时服务器上部署应用程序并查看主页的html(查看源代码)时,除了<script src="/AFR/Scripts/jquery-ui-1.8.20.min.js"></script>
缺less。 我们已经validation了这些标签中提到的所有文件都在脚本文件夹中。 文件夹结构与开发机器上的结构完全相同。 在临时服务器上,web.config文件的<compilation targetFramework="4.0" />
这意味着,默认情况下,debug =“false”。
因此,一些JavaScript函数在登台服务器上失败。 分段和开发机器都是Windows 2012。
请帮忙。 谢谢。
根据您的意见,我们需要了解Bundling
机制如何在MVC中工作。
编辑 :根据VSDev下面的评论,你需要确保WebGrease已经安装到你的项目中。 NuGet最简单的就是安装这个软件包。
当你设置一个bundleconfiguration(例子不是从上面来说明的)
bundles.Add(new ScriptBundle("~/bundles/mainJs") .Include("~/Scripts/mainSite.js") .Include("~/Scripts/helperStuff.js");
然后,在你的视图中,调用类似@Scripts.Render("~/bundles/mainJs")
。 当你的web.config被设置为一个debugging编译, 或者你使用BundleConfig.cs
文件中的以下行显式closures捆绑
BundleTable.EnableOptimizations = false;
然后,在你看来,你会看到以下内容
<script src="/Scripts/mainSite.js" type="text/javascript"></script> <script src="/Scripts/helperStuff.js" type="text/javascript"></script>
这些是构成我们的软件包的单独项目,未压缩并单独列出。 这些在debugging模式下单独列出的原因是,您可以debugging脚本并在写入时看到它们(实际variables名称等)。
现在,当我们没有进行debugging编译并且没有closuresEnableOptimizations
特性时,MVC将把这些文件合并到我们的包中,压缩(缩小)它们,并且只输出一个脚本标签。
<script src="/bundles/mainJs?v=someBigLongNumber" type="text/javascript"></script>
请注意,源与捆绑软件configuration中的软件包名称相同。 此外,只要您更改该文件包中的文件, ?v=
之后的数字将会更改。 这是为了防止客户端浏览器caching旧的js和css文件。
你的脚本仍然存在并被输出,但是它们被压缩并合并成一个名为/bundles/mainJs
文件。 这个function是存在的
A)压缩文件并减less正在传输的信息,
B)减less对网站的调用次数,以检索呈现页面所需的内容。
没有什么是缺失的,这听起来像一切工作正常。 在生产现场,缩小使得这些文件几乎不可能被读取,因此为什么缩小在debugging时不起作用。
至于为什么jQuery UI仍然是一个JS文件,确保有人没有硬编码到你的布局视图。 至于JS错误,可能是你的开发盒上存在的错误,或者是某些东西不能正确压缩(但是,在我所有的MVC开发中,我还没有看到由于缩小而导致的JS错误)。
我遇到了同样的问题,我不知道为什么,但事实certificate,Scripts.Render生成的脚本链接没有.js扩展名。 因为它也没有Type属性,所以浏览器无法使用它(chrome和firefox)。
为了解决这个问题,我改变了我的包configuration,以生成带有js扩展名的编译文件,例如
var coreScripts = new ScriptBundle("~/bundles/coreAssets.js") .Include("~/scripts/jquery.js"); var coreStyles = new StyleBundle("~/bundles/coreStyles.css") .Include("~/css/bootstrap.css");
注意new StyleBundle(...
而不是说~/bundles/someBundle
,我是说~/bundlers/someBundle.js
或~/bundles/someStyles.css
..
这会导致在src属性中生成的链接在启用优化时具有.js或.css,因为浏览器根据文件扩展名知道在get请求上使用什么MIME /types,并且一切正常。
如果我脱下延伸,一切都打破。 这是因为@Scripts和@Styles没有提供所有必要的属性来理解一个没有扩展名的文件的src。
通过添加以下代码的线捆绑configuration它适用于我
bundles.IgnoreList.Clear();
按照链接更多的解释
对我来说,修正是将System.Web.Optimization的版本升级到1.1.0.0当我在版本1.0.0.0时,它永远不会parsing子目录中的.map文件(即正确缩小和捆绑子目录中的脚本)
每当我在我的web.config中设置debugging=“closures”,并运行我的mvc4应用程序,我会最终…
<script src="/bundles/jquery?v=<some long string>"></script>
在我的HTML代码和JavaScript错误
Expected ';'
有2种方法来摆脱javascript的错误
- 在BundleConfig.cs中设置
BundleTable.EnableOptimizations = false
要么
- 我结束了使用NuGet包pipe理器来更新WebGrease.dll。 无论debug =“true”还是debug =“false”,它都可以正常工作。
我使用Identity2然后脚本没有加载匿名用户,然后我添加此代码在webconfig和Sloved。
<location path="bundles"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>