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的错误

  1. 在BundleConfig.cs中设置BundleTable.EnableOptimizations = false

要么

  1. 我结束了使用NuGet包pipe理器来更新WebGrease.dll。 无论debug =“true”还是debug =“false”,它都可以正常工作。

我使用Identity2然后脚本没有加载匿名用户,然后我添加此代码在webconfig和Sloved。

 <location path="bundles"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>