我正在处理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请求显示错误。
答案 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()
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
更改为您喜欢的任何其他名称