Yii1: CGridView link ajax 请求显示 400 Bad Request

Yii1: CGridView link ajax request shows 400 Bad Request

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

这是网格视图:

<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'];
}

accessRules 添加了 readNotification 函数。单击 link 时正在加载新页面,但 ajax 请求显示错误。

尝试使用您的 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 更改为您喜欢的任何其他名称