禁用调试时,使用捆绑缩小的脚本在 MVC 3 中不起作用 ASP.NET
Script minified with bundling don't work in ASP.NET MVC 3 when debugging is disabled
我的 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 true
和return false
将分别替换为return!0
和return!1
。
(即使您致电Bundle.Transforms.Clear()
也会发生这种情况)
Slick Grid 的 compileFilter
和 compileFilterWithCaching
函数尝试使用正则表达式重写循环构造内部的过滤器函数,并将return
语句更改为continue
语句。
您从捆绑中删除过滤器函数的解决方案也对我有用,但我不喜欢使用捆绑的例外,所以我修改了 slick.dataview.js (v2.2) 来处理 ASP.NET 捆绑的替换:
我将这两行添加到compileFilter
和compileFilterWithCaching
:
.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
函数对提供的筛选器函数执行一些硬编码字符串替换,这些替换在捆绑筛选器函数并在发布代码中缩小时失败。
我将过滤器函数移出缩小的脚本。这解决了问题。
- 谷歌将部分页面加载后自动完成不起作用 ASP.Net MVC
- 秘银你好世界 MVC 示例不起作用
- Jquery upload - MVC 文件名不起作用
- 在mvc上使用日期选择器不起作用
- Select选项包含在验证模型MVC时不起作用
- 用于导出Excel的.Net MVC 4.5 JqGrid按钮功能不起作用.什么'我的代码错了
- Kendo mvc网格客户端模板javascript函数不起作用
- 选项卡在 MVC 应用程序中不起作用
- ReactJS.NET MVC 教程不起作用
- ASP.NET MVC 验证在引导模式上不起作用
- JavaScript 在 MVC Web 应用程序中不起作用
- 具有资源视图的完整日历在 ASP.NET MVC 中不起作用,加载时 - 0x800a01bd - javaScript
- 在 mvc 应用程序中使用 href 属性重定向 asp.net 不起作用
- Javascript对象数组到MVC操作几乎不起作用,但不是完全
- 单击锚点后,jquery验证不起作用(Spring MVC + JQuery)
- 禁用调试时,使用捆绑缩小的脚本在 MVC 3 中不起作用 ASP.NET
- ASP MVC 5 自动完成不起作用
- 用于更新 mvc 中文本框值 asp.net 脚本不起作用
- JQuery 输入类事件捕获在 MVC 5 ASP.NET 不起作用
- 简单应用程序的Javascript MVC不起作用