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
更改为您喜欢的任何其他名称
我正在开发 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()
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
更改为您喜欢的任何其他名称