禁用调试时,使用捆绑缩小的脚本在 MVC 3 中不起作用 ASP.NET

Script minified with bundling don't work in ASP.NET MVC 3 when debugging is disabled

本文关键字:MVC 不起作用 NET ASP 脚本 缩小 调试      更新时间:2023-09-26

我的 Web 应用程序在设置<compilation debug="true" />之前可以使用捆绑脚本正常工作。如果我将调试设置为 false ,我的自定义脚本会缩小,然后停止工作。

我可以在不同的浏览器上重现这个麻烦,使用 F12 工具检查所有内容 - 没有错误,找出全局 JavaScript 变量是否有正确的名称。唯一值得注意的区别是脚本被缩小了,局部变量名称同样被更改了参数名称,这应该不会破坏任何东西。我还捆绑和缩小了其他自定义脚本,它们可以正常工作。

我认为这是愚蠢的事情。我不是JavaScript专家,也许我错过了一些对你来说显而易见的东西。你能给我一个提示如何找到问题的原因吗?

问候雷沙德

您已经发现问题区域compileFilter,但是您的问题和这篇文章帮助我找出了根本原因:https://github.com/mleibman/SlickGrid/issues/244

我的猜测:Slick Grid的作者更希望你使用options.inlineFilters = false来解决这个问题。

我想了解为什么这个问题只在使用捆绑 ASP.NET 时发生,并发现:

使用 ASP.NET 捆绑和缩小时,return truereturn false将分别替换为return!0return!1

(即使您致电Bundle.Transforms.Clear()也会发生这种情况)

Slick Grid 的 compileFiltercompileFilterWithCaching 函数尝试使用正则表达式重写循环构造内部的过滤器函数,并将return语句更改为continue语句。

您从捆绑中删除过滤器函数的解决方案也对我有用,但我不喜欢使用捆绑的例外,所以我修改了 slick.dataview.js (v2.2) 来处理 ASP.NET 捆绑的替换:

我将这两行添加到compileFiltercompileFilterWithCaching

.replace(/return!1's*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
.replace(/return!0's*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true

因此

  var filterBody = filterInfo.body
      .replace(/return false's*([;}]|$)/gi, "{ continue _coreloop; }$1")
      .replace(/return true's*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1")
      .replace(/return ([^;}]+?)'s*([;}]|$)/gi,
      "{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");

成为

  var filterBody = filterInfo.body
      .replace(/return false's*([;}]|$)/gi, "{ continue _coreloop; }$1")
      .replace(/return true's*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1")
      .replace(/return!1's*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
      .replace(/return!0's*([;}]|$)/gi, "{ _retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
      .replace(/return ([^;}]+?)'s*([;}]|$)/gi,
      "{ if ($1) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");

现在我可以继续使用 ASP.NET B&M 捆绑我所有的脚本,光滑的网格很高兴。

更新:由于缓存添加步骤,compileFilterWithCaching实际上略有不同。更正function compileFilterWithCaching()更新为:

  var filterBody = filterInfo.body
      .replace(/return false's*([;}]|$)/gi, "{ continue _coreloop; }$1")
      .replace(/return true's*([;}]|$)/gi, "{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1")
      .replace(/return!1's*([;}]|$)/gi, "{ continue _coreloop; }$1") // hack: .net bundling uses !1 for false
      .replace(/return!0's*([;}]|$)/gi, "{ _cache[_i] = true;_retval[_idx++] = $item$; continue _coreloop; }$1") // hack: .net bundling uses !0 for true
      .replace(/return ([^;}]+?)'s*([;}]|$)/gi,
      "{ if ((_cache[_i] = $1)) { _retval[_idx++] = $item$; }; continue _coreloop; }$2");

我正在考虑在 GitHub 上对此更改提出拉取请求,但我可能会先对其进行一些修改,以添加是否处理 ASP.NET 捆绑的选项......待定。与此同时,我将此问题发布到 GitHub 页面:https://github.com/mleibman/SlickGrid/issues/1053

在 depper 调试后,a 在函数slick.dataview.js脚本中找到了错误compileFilter源。我在页面上使用SlickGrid并在Slick.Data.DataView对象中设置过滤器。 compileFilter函数对提供的筛选器函数执行一些硬编码字符串替换,这些替换在捆绑筛选器函数并在发布代码中缩小时失败。

我将过滤器函数移出缩小的脚本。这解决了问题。