【发布时间】:2011-10-09 16:43:47
【问题描述】:
我有以下 AJAX 调用:
$('#FonykerUsernameRegister').blur(function(){
if($(this).val().length > 2) {
alert($(this).val());
$.ajax({
url: '<?php echo $html->url('/fonykers/validate_username',true); ?>' + '/' + $(this).val(),
dataType: 'json',
type: 'POST',
success: function(response) {
if(!response.ok) {
$(this).addClass('error');
error.html(response.msg);
error.fadeIn();
} else {
if($(this).is('.error')) {
alert('im in');
$(this).removeClass('error');
}
$(this).addClass('ok');
}
},
error:function (xhr, ajaxOptions, thrownError){
alert('You fail');
alert(xhr.statusText);
alert(thrownError);
}
});
} else {
error.html('Username must have at least 3 characters');
error.fadeIn();
$(this).addClass('error');
}
});
这是它调用的方法:
function validate_username($username) {
$this->layout = 'ajax';
$response = array();
$fonyker = $this->Fonyker->find('first', array(
'conditions' => array('Fonyker.username' => $username)
));
if(!strlen($username) > 2) {
$response = json_encode(array('ok' => false, 'msg' => 'Username must have at least 3 characters'));
} else if(!preg_match('"^[a-zA-Z0-9]+$"', $username)) {
$response = json_encode(array('ok' => false, 'msg' => 'Username must be alphanumeric'));
} else if ($fonyker) {
$response = json_encode(array('ok' => false, 'msg' => 'Username is already in use'));
} else {
$response = json_encode(array('ok' => true, 'msg' => ''));
}
echo $response;
}
在 AJAX 调用中,它总是转到错误部分并输出该错误,我在我的 PHP 代码中看不到任何空格。有什么想法吗?
编辑:
发生的事情是 CakePHP 在响应中回显了整个视图,但不是真正的视图而是错误屏幕。
如果您在控制器中需要不需要视图的 AJAX 方法,则必须在执行任何操作之前将控制器方法上的 $this->autoRender 属性设置为 false。
【问题讨论】:
-
错误是针对 非-空白字符,而不是空白字符。另外,你能发布结果的json吗?使用 Firebug(或类似工具)观察响应。
-
查看响应,我看到 cake 发送回带有 JSON 响应的整个页面 HTML,因为它说它需要一个视图。
-
你不应该在你的控制器方法中回显一些东西。这就是视图的用途。解决此问题的技术上正确的方法是在此处设置一个响应变量,并在视图中回显它。创建一个全新的文件来回显一行有点乏味,因此您也可以从此方法返回 $response ,您将在 ajax 调用中获得响应。两者都比在我认为的控制器方法中回显更可取。
标签: php jquery ajax json cakephp