ASP.NET MVC中cshtml定义的变量无法在打包JS文件中访问
问题产生原因
核心原因有两个:
- 脚本执行顺序错误:浏览器解析HTML时会按照从上到下的顺序同步执行脚本,当前代码中先通过
@Scripts.Render引入并执行了depositreview打包脚本,脚本执行时后面内联<script>块里的变量还未完成声明赋值,自然无法被外部脚本访问。 - 内联脚本存在语法错误:定义
addFundAccountRequest变量时错误使用了冒号而非赋值等号,这个语法错误会导致整个内联脚本块执行中断,块内所有变量都不会被注册到全局作用域,即便调整了加载顺序也会出现变量访问失败的问题。
修复方案
- 调整脚本加载顺序:将存放公共变量的内联脚本块移动到
@Scripts.Render调用之前,保证外部打包脚本执行时,所有依赖的全局变量已经完成声明和赋值。 - 修正内联脚本的语法错误:把
addFundAccountRequest定义行的冒号替换为等号,消除语法错误保证内联脚本正常执行。 - (可选优化)避免全局变量污染:不要直接零散声明多个全局变量,可以统一挂载到一个专属全局配置对象上,减少和其他脚本变量重名冲突的概率。
修复后的基础实现代码:
@section Scripts { <script type="text/javascript"> // 优先定义所有外部脚本依赖的变量,同步修正语法错误 var addFundAccountRequest = "@Url.Action("AddFundAccountRequest", "FundTransfer")"; var depositReviewUrl = '@Url.Action("DepositReviewMobile", "FundTransfer")'; var paymentProviderUrl = '@Url.Action("PaymentProviderMobile", "FundTransfer")'; var account = '@Model.Account'; // ...其余变量定义 </script> @* 所有依赖变量定义完成后,再引入外部打包脚本 *@ @Scripts.Render("~/bundles/trader/mobile/depositreview") }
如果做命名空间优化,内联变量可以改成如下写法,外部脚本统一从window.PageConfig读取配置即可,能大幅降低全局变量冲突概率:
window.PageConfig = { addFundAccountRequest: "@Url.Action("AddFundAccountRequest", "FundTransfer")", depositReviewUrl: '@Url.Action("DepositReviewMobile", "FundTransfer")', paymentProviderUrl: '@Url.Action("PaymentProviderMobile", "FundTransfer")', account: '@Model.Account' // ...其余配置项 }
内容的提问来源于stack exchange,提问作者Post Impatica
相关产品推荐
相关产品推荐

