You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playframework:Javascript调用控制器action时URL解析异常求助

解决JavaScript调用后端路由生成错误URL的问题

看起来你遇到的问题是后端模板引擎没有正确解析@controllers.app.test()这个表达式,导致它被当成字符串直接拼到URL里,出现了127.0.0.1:9001/admin/@controllers.app.test()这种错误路径。我来帮你梳理下原因和可行的解决办法:

问题根源

你之前的写法location.href = '@controllers.app.test()'能正常工作,是因为这段代码位于后端模板引擎(比如Play Framework模板)处理的文件中,引擎会自动把@controllers.app.test()替换成实际的路由URL。现在这段代码可能脱离了模板引擎的处理范围(比如移到了静态JS文件里),或者模板解析规则有变化,导致表达式没有被替换。

解决办法

1. 把路由URL提前注入到全局变量(推荐)

在你的模板文件(比如.scala.html或其他后端模板文件)里,添加一个全局变量存储解析后的URL,然后在JS中引用这个变量:

<!-- 在模板文件的<script>标签中,让引擎先解析路由 -->
<script>
window.testRouteUrl = '@controllers.app.test()';
</script>
<!-- 引入你的外部JS文件 -->
<script src="/path/to/your/script.js"></script>

然后在你的JS代码里:

// 直接使用全局变量里的已解析URL
location.href = window.testRouteUrl;

2. 通过隐藏DOM元素获取路由URL

在模板文件里创建一个隐藏的链接元素,让模板引擎解析它的href属性,再用JS获取这个属性值:

<!-- 模板文件中添加隐藏链接 -->
<a id="testRouteLink" href="@controllers.app.test()" style="display: none;"></a>

JS代码中:

// 获取DOM元素的href属性(已经是解析后的完整URL)
location.href = document.getElementById('testRouteLink').href;

3. 检查模板文件的处理状态

确认你的JS代码所在的文件仍然被后端模板引擎处理:

  • 如果是把JS代码从模板文件移到了静态.js文件,静态文件不会被模板引擎解析,所以必须用上面两种方法提前注入URL。
  • 检查模板引擎的语法规则是否有变更,比如某些框架可能对JS中的表达式解析有特殊要求(比如Play Framework中是否需要用@(controllers.app.test())这种包裹形式)。

内容的提问来源于stack exchange,提问作者user8574635

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:21:46