如何通过ajax获取控制器方法中的数据?

时间:2016-05-27 11:41:32

标签: php ajax yii2

我尝试异步发送数据到控制器的方法。我想这是一个微不足道的挑战,但确实没有在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错误"未指定所需参数"。 你能解释一下我该怎么办?非常感谢!

2 个答案:

答案 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() {
    ...
}