我有一个gsp页面,其中包含一个执行ajax调用的JS函数(名为“sample”)。
function sample() {
var params = { office: {id: "testId"}, population: {id: "testId2"}};
$.ajax({
url: "http://localhost:8080/officeProj/mustache/list",
cache: false,
contentType: "application/json; charset=utf-8",
type: "POST",
dataType: "json",
data: JSON.stringify(params),
complete:function(json){
console.log(" reponse :"+ json);
},
success: function(officeData) {
var template = "<h1>{{data.firstName}} {{data.lastName}}</h1>";
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
} ,
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log("error :"+XMLHttpRequest.responseText);
}
})
}
现在,此ajax调用到达相应的GRAILS控制器和相应的操作,定义为:
def list = {
withFormat {
html { return [title: "Mustache" , data:[firstName:"Indiana", lastName:"Jones"], address:"NYC" ] }
json {
// extract the data to be rendered to the page
println("processing JSON.....")
render ([title: "Mustache" , data:[firstName:"Indiana", lastName:"Jones"], address:"NYC" ] as JSON)
}
}
}
问题是控件从不通过控制器动作中的withFormat-&gt; json,因此我没有看到预期的结果。(当控件返回到gsp页面时,它会通过“完成“但不是通过”成功“。没有记录错误。任何人都可以看到我的ajax电话有任何问题吗?如果我需要提供更多信息,请告诉我。请提前谢谢。
答案 0 :(得分:4)
即使你的问题似乎已经解决了,我想提一下这背后的实际原因。
问题似乎与grails进行内容协商的方式有关。
根据grails docs,grails将查找accept标头,这将决定响应格式。
但是默认情况下,这里的catch是config.groovy,grails.mime.use.accept.header = false,它基本上忽略了accept标头,所以即使你在设置dataType:“json” ajax请求(它会将接受标头设置为“application / json”),它不会查找接受标头,响应格式将始终为“all”,这是默认值。
所以基本上设置grails.mime.use.accept.header = true,将解决问题。
希望这有帮助
答案 1 :(得分:3)
这通常会让人们感到兴奋,特别是从Grails 1.x转移到Grails 2.x时。您必须仔细阅读docco。
大胆的重点是我的......要注意的另一个重要因素是withFormat方法处理 使用响应格式,而不是请求格式。从Grails 2.0开始, 在请求中提供了单独的withFormat方法 您可以用来处理由...规定的请求格式 请求的CONTENT_TYPE标头:
request.withFormat {
xml { .. }
html { .. }
}
答案 2 :(得分:0)
另一种可能的解决方案。
医生说:
请注意,如果请求格式为“全部”,或者多个内容类型在接受标头中具有相同的“q”评级,则类型的顺序为。在前一种情况下,执行块中的第一个类型处理程序
我认为这意味着如果您的Accept标头如下所示:
Accept:application/json, text/javascript, */*; q=0.01
*/*
表示全部接受,这意味着无论其他处理程序如何,都将使用第一个处理程序。
快速解决方案:将html {}闭包移至最后。