Grails中点击Button无法跳转至指定视图问题求助
首先得点明一个核心点:remoteFunction 本质是生成AJAX请求的代码,它默认只会异步调用控制器的action,不会自动帮你跳转页面——这大概率是你点击按钮没反应的根本原因!下面是具体的排查和修复方案:
1. 纠正remoteFunction的使用逻辑(最可能的解决方向)
你现在的需求是跳转到organization控制器的index视图,但remoteFunction本身不负责页面跳转。根据你的场景,有两种选择:
选项A:直接用普通跳转逻辑(最简单)
如果这个Cancel按钮不需要AJAX交互,只是单纯跳转页面,完全没必要用remoteFunction,直接在onclick里写跳转代码即可,完全不会破坏你的CSS样式:
<button type="button" onclick="window.location.href='${createLink(controller: 'organization', action: 'index')}'" class="cancelbtn">Cancel</button>
这里用createLink标签生成正确的URL,比硬写路径更稳妥,Grails会自动处理项目上下文路径的问题。
选项B:如果必须保留AJAX交互
如果你的场景需要先通过AJAX调用index action(比如要先执行一些异步操作),完成后再跳转,那得给remoteFunction添加onSuccess回调:
<button type="button" onclick="${remoteFunction( action:'index', controller: 'organization', onSuccess: 'window.location.href = "' + createLink(controller: 'organization', action: 'index') + '"' )}" class="cancelbtn">Cancel</button>
这样AJAX请求完成后,会自动触发页面跳转逻辑。
2. 检查Grails的AJAX依赖是否加载
remoteFunction需要依赖Grails的AJAX支持库(旧版用Prototype,新版常用jQuery),如果页面没引入对应的JS库,生成的代码会直接报错,导致按钮无响应:
- 打开浏览器控制台(F12),查看是否有
$ is not defined或Prototype is not defined这类错误 - 确保你的GSP页面
<head>里已经引入了对应资源:<g:javascript library="jquery" /> <!-- 新版Grails推荐用jQuery --> <!-- 或者旧版用Prototype --> <g:javascript library="prototype" />
3. 验证控制器index action是否正常
按钮无响应也有可能是index action本身存在问题,导致AJAX请求失败:
- 打开浏览器网络面板(F12 -> Network),点击按钮后查看是否有对应的请求,状态码是否为200
- 检查
OrganizationController的index方法是否抛出异常,或者是否正确返回视图
4. 退而求其次:用g:submitButton但保留样式
如果你担心g:submitButton破坏样式,其实可以给它直接绑定cancelbtn类,同时阻止表单默认提交行为:
<g:submitButton class="cancelbtn" onclick="window.location.href='${createLink(controller: 'organization', action: 'index')}'; return false;" value="Cancel" />
这里的return false是为了阻止表单提交(如果按钮在表单内),确保只执行跳转逻辑,样式和你原来的按钮完全一致。
内容的提问来源于stack exchange,提问作者Ashwin Karki

