我尝试异步发送数据到控制器的方法。我想这是一个微不足道的挑战,但确实没有在SO中找到答案。
这是我的代码:
的控制器
public function actionRaiting(string $idUser, string $idBook, int $number )
{
$model = new Raiting();
$model->idBook = $idBook;
$model->idUser = $idUser;
$model->number = $number;
if (\Yii::$app->request->isAjax)
{
if ($model->load(\Yii::$app->request->post()))
$model->save();
}
}
脚本
$('.rating-input i').click(function()
{
$.ajax(
{
url: 'raiting',
type: "POST",
contentType: 'application/json',
data: {
idUser: $('[name=idUser]').val(),
idBook: $('[name=idBook]').val(),
number: $(this).data("value") ,
},
dataType : 'json'
});
});
我收到400错误"未指定所需参数"。 你能解释一下我该怎么办?非常感谢!
答案 0 :(得分:2)
你应该试试:
public function actionRaiting()
{
$model = new Raiting();
$model->idBook = $_POST['idBook'];
$model->idUser = $_POST['idUser'];
$model->number = $_POST['number'];
// ...
}
您应该将csrf令牌添加到您的请求参数中,例如:
var csrfParam = $('meta[name="csrf-param"]').attr('content'),
csrfToken = $('meta[name="csrf-token"]').attr('content');
并且:
data: {
csrfParam : csrfToken,
// ...
}
了解更多关于:
答案 1 :(得分:0)
您的方法希望值为GET
参数。您正在POST
正文中传递它们。通常我会建议将参数附加到网址。
但是,由于您要将数据保存到数据库(应该通过POST
完成),我建议您从函数中删除参数。要进行的任何验证都应该在保存之前在模型中完成。
public function actionRaiting() {
...
}