Yii1:CGridView链接ajax请求显示400 Bad Request

时间:2018-04-17 08:10:53

标签: ajax cgridview yii1.x

我正在处理Yii 1申请。在我的应用程序中,有一个CGridView,其中有一个链接,它也会在onclick事件上触发ajax请求。我发送id作为参数。但是ajax返回 400 Bad Request 错误。请帮我解决这个问题。

这是Gridview:

<h3>Civil Cases</h3>
<?php  $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'notifications-grid',
    'dataProvider'=>$dataProvider_civil,
    'summaryText' => false,

    'columns'=>array(
        array(
            'name' => 'case_id',
            'type' => 'raw',
            'value' => 'CHtml::link(CHtml::encode($data->case_id),array("civilcases/view","id"=>$data->case_id), array("onclick"=>"js:readNotification($data->id)"))'
        ),
        array(
            'name' => 'caseno',
            'type' => 'raw',
            'value' => 'CHtml::link(CHtml::encode($data->caseno),array("civilcases/view","id"=>$data->case_id), array("onclick"=>"js:readNotification($data->id)"))'
        ),
        'date_filing',
        'next_date',
        'panel_lawyer_id',

    ),
));
?>

这是脚本:

<script>
    var readNotification = function(id) {
        console.log("button clicked with ID: "+id); //getting id here
        $.ajax({
            type:'POST',
            url:'<?php echo Yii::app()->createUrl("notifications/readNotification");?>',
            data: {id: id}
        });
    };
</script>

这是控制器:

public function actionReadNotification(){
    echo $_POST['id'];
}

将readNotification功能添加到 accessRules 。点击链接时,新页面正在加载,但是ajax请求显示错误。

1 个答案:

答案 0 :(得分:0)

尝试使用ajax请求在数据中添加csrf令牌。

<script>
    var readNotification = function(id) {
        console.log("button clicked with ID: "+id); //getting id here
        $.ajax({
            type:'POST',
            url:'<?php echo Yii::app()->createUrl("notifications/readNotification");?>',
            data: {id: id,<?= 
            Yii::app()->request->csrfTokenName?>:<?=Yii::app()->request->csrfToken?>,}
        });
    };
</script>

您还可以通过在beforeAction()

中添加以下内容来停用csrftoken
public function beforeAction($action) {

    if($action->id=='readnotification'){
        $this->enableCsrfValidation = false;
    }
    return parent::beforeAction($action);
}

但不建议这样做。

EDIT

我错误地添加了Yii::$app->request而不是Yii::app()->request,因为第一个是Yii2而不是Yii1,请将其更改为

<?=Yii::app()->request->csrfTokenName?>:<?=Yii::app()->request->csrfToken?>

并确保您拥有具有以下配置的request组件

'components'=>array(
.
.
.
    'request'=>array(
          'enableCookieValidation'=>true,
          'enableCsrfValidation'=>true,
          'csrfTokenName'=>'_my-token',
    ),

注意:您可以将_my-token更改为您喜欢的任何其他名称