我正在尝试制作一个AJAX请求。更新是在数据库中完成的,但它没有成功,如果我删除dataType
,它就会成功,但是在两种形式它返回JSON和HTML时应该只返回JSON。
我在代码中看不到任何与众不同的东西。为什么会这样。我的JSON会以任何方式无效吗?
使用Javascript
$(document).ready(function () {
$('#depositar').submit(function () {
var form = $(this);
var dados = $(this).serialize();
$.ajax({
url: 'http://localhost/caixamvc/conta/depositar',
method: 'POST',
dataType: 'json',
data: dados,
beforeSend: function () {
$("#retorno").html('Aguarde, validando dados...');
},
success: function (resposta) {
$("#retorno").html(resposta.dados);
}
});
return false;
});
});
调节器
public function depositar() {
if (isset($_POST['valor'])) {
$value = $_POST['valor'];
$json = [];
if ($_SESSION['tipo_conta'] == 1) {
$conta = new ContaCorrente;
} else {
$conta = new ContaPoupanca;
}
$conta->depositar($_SESSION['user'], $value);
if ($conta->getResult()) {
$json['dados'] = "Tudo certo";
}else{
$json['retorno'] = "Nada aqui";
}
echo json_encode($json);
}
$this->loadTemplate('depositar', $this->getData());
}
视图
<h4>Depositar</h4>
<form id="depositar" method="POST">
Conta:<br/>
<input type="text" name="valor" /><br/><br/>
<input type="submit" name="depositar" value="Depositar"/>
<div id="retorno"></div>
</form>
响应
在您的控制器中,您有条件地返回JSON:
if (isset($_POST['valor'])) {
//...
echo json_encode($json);
}
但随后总是返回HTML:
$this->loadTemplate('depositar', $this->getData());
如果不返回JSON(条件为false),则返回有效的HTML。但是当条件成立时,你最终都会返回到客户端。因此,响应既不是有效的JSON也不是有效的HTML。
返回JSON时,不要返回HTML。它必须是一个或另一个:
if (isset($_POST['valor'])) {
//...
echo json_encode($json);
} else {
$this->loadTemplate('depositar', $this->getData());
}
理想情况下,您将完全使用两个不同的控制器操作。一个显示页面,另一个返回数据。这样你就没有一个功能可以做多个事情,需要if
条件来检查它应该做什么。
每个功能都应该做一件事。
The docs say,dataType
是:
您期望从服务器返回的数据类型。
当你回应一些JSON时,你实际上是在返回HTML。这是因为你正在做这些中的一个(或两个):