我导航到index
的MyController
操作。 index
页面上的某些代码正在AJAX回调myAction
中的MyController
。我希望myAction
操作将一些数据作为JSON返回到我的AJAX调用中,这样我就可以在数据客户端进行一些操作,但是不是像我想要的那样将数据作为JSON返回,而是将数据显示为文本。
我的Grails Controller 的示例:
class MyController {
def index() {
render( view: "myView" )
}
def myAction {
def mapOfStuff = [ "foo": "foo", "bar": "bar" ]
render mapOfStuff as JSON
}
}
我的JavaScript示例:
$( function() {
function callMyAction() {
$.ajax({
dataType: 'json',
url: base_url + '/myController/myAction',
success: function( data ) {
$(function() {
if( data.foo ) {
alert( data.foo );
}
if( data.bar ) {
alert( data.bar );
}
});
}
});
}
});
我期望的是我的页面将呈现,然后将调用我的JavaScript,然后将显示两个警报。相反,JSON数组在我的浏览器窗口中显示为文本:
{"foo":"foo","bar":"bar"}
此时,我地址栏中的URL的最后一段是
myAction
而不是index
。现在,如果我手动输入索引页面的URL并按刷新,则所有操作都将按预期进行。我有完全相同的方法打了六个AJAX call ,但都没有问题。这是怎么回事?
更新1:
我注意到了当我在
index
的MyController
操作中设置一个断点,并在myAction
Action 中设置另一个断点时,即使我导航到myAction
,在登录后立即在index
的断点之前命中index
的断点。实际上,index
操作中的断点永远不会命中。这显然更接近我的问题的根本原因,但是为什么会发生呢?更新2:
我正在使用Spring Security,我注意到即使我将默认URL设置为...
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/myController'
...登录时
MyController
的“索引”操作中的断点永远不会被击中,但是myView
正确呈现。 Spring Security在做什么,可以通过我的 Controller 加载我的 View 而又是什么呢?更新#3:
我已经找到了解决该问题的方法,问题是Spring Security在后台做了一些奇怪的事情。所以我只是将
alwaysUseDefault
添加到我的配置中并将其设置为true,如下所示:grails.plugins.springsecurity.successHandler.alwaysUseDefault = true
现在,我击中
index
的MyController
Action 中设置的断点,然后才击中myAction
中的断点,就像我期望的那样。不幸的是,此解决方案不是最佳解决方案,因为即使用户试图导航到其他页面,现在也总是在登录后将其重定向到defaultTargetUrl
。尽管这种解决方案可以解决我的问题,但它提出了一个问题,Spring Security如何重定向到我的
defaultTargetUrl
,它被设置为这样……grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/myController'
...无需经历
index
的MyController
操作?
最佳答案
尝试使用:
def mapOfStuff = [ foo: "foo", bar:"bar"]
而不是将这些键用作Groovy字符串。
关于grails - “render as JSON”将JSON显示为文本,而不是按预期将其返回给AJAX调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904820/