cakephp,jquery,.ajax(),dataType:json

是否可以在没有cakephp控制器function的情况下进行操作? 我试图让我的服务器返回一个不是字符串的数据类型 – 而是一个数组

我的控制器function:

function test() { $this->layout = 'plain'; $task['Numbers']['uno'] = 'mooo'; $task['Numbers']['dos'] = 'says the cow'; $result = json_encode($task); $this->set('result', $result); } 

我的视图文件test.ctp

echo $result;
echo $result; 

我的jquery:

$('#test').live('click', test); function test() { var data = $('#form').serialize(); $.ajax({ type: "post", url: "/controller/test", data: data, dataType: 'json', success: function(response){ alert(response.Numbers.uno); } }); } 

点击标记为test的html元素并没有给我任何东西。 但如果我拿出来

 dataType: 'json', 

并改变

 alert(response.Numbers.uno); 

 alert(response); 

在我的jquery中 – 我得到一个警告:json编码的数据,但作为一个字符串(

 alert(typeof response); 

有没有人知道可能会发生什么?

首先,回答你的问题,是的,你可以在没有视图的情况下做到(这是一个很好的理由)。 在你的控制器动作( test ,在这种情况下),只需设置$this->autoRender = false; 。 这就是我通常做的事情,只是在控制器本身中回显编码的JSON字符串。 这种方式不那么杂乱。

接下来我要看的是config.php中的调试设置。 如果没有设置为0,那么很有可能这是你的问题。 您的echo语句可能会回显JSON格式的字符串,但会向其附加调试输出。 在该方法中,只包括Configure::write ( 'debug', 0 ) 。 这将禁用当前请求的调试。 我通常在我的AppController中实际执行此操作:

 if ( $this->RequestHandler->isAjax() ) { Configure::write ( 'debug', 0 ); } 

我会使用像Firebug这样的工具,看看你的ajax请求发生了什么。 它将监视这些请求并提供请求和响应标头供您检查。 这可能有所帮助。 如果后者是问题,那么Firebug会在响应头中向您显示。

我同意Rob,除了在app控制器中设置调试。 这对我来说有点烦人,因为每次要为特定function调试某些东西时,都必须在app控制器中设置调试级别。 我在我正在工作的控制器中写出我的处理程序。

 Configure::write('debug', 0); $this->autoRender = false; 

我同意使用萤火虫。 使用firebug所有你需要做的就是打开firebug,点击控制台,然后运行你的测试。 这将告诉您使用jquery执行的操作并为您提供结果。

查看关于请求处理的cakePHP书籍:

http://book.cakephp.org/view/174/Request-Handling

CakePHP具有一些内置function来处理返回json的控制器方法。

您必须在使用之前转换数据。
看到这个答案:

用json响应jQuery ajax请求,怎么样?

你必须使用

 var json = $.parseJSON(response); alert(json.Numbers.uno); 

我只是用

 die(json_encode(array('success' => true, 'result' => $result))); 

在被叫控制器方法的最后,它适用于我。