无法从yii2中的ajax调用获得响应

时间:2017-11-11 06:02:28

标签: php jquery ajax gridview yii2

我有GirdView,其中包含checkbox。现在我有一个按钮,我将其路由到另一个action controller。以下是我的代码

 <?= GridView::widget([
         'dataProvider' => $dataProvider,
          /*'filterModel' => $searchModel,*/
          'id'=>'grid',
       'columns' => [

        ['class' => 'yii\grid\CheckboxColumn'],
        'Meter Serial Number',
        'Issued To',
        'Store',


 ],
]); ?> 
<a href="<?= URL::toRoute(['ogpheader/viewsetpdf','id'=>'myid'])?>" type="submit" class="btn btn-primary" name="issue_pdf" id="myid" onclick="getRows()">Set PDF</a>


$(document).ready(function () {      

 $('#myid').click(function() {

     var keys = $('#grid').yiiGridView('getSelectedRows');

    // alert(keys);

     $.post({     
      url: 'ogpheader/viewsetpdf',
      dataType: 'json',
      data:{keylist: keys},
      success:function(data) {
        alert('Done')
      }

 });
}) });

然后在我的控制器中

public function actionViewsetpdf()
{
    /*$model = $this->findModel($id);
    print_r($model);*/

    if(isset($_POST['keylist']))
    {
        $keys = json_decode($_POST['keylist']);
        print_r($keys);
    }



    exit();

}

当我点击按钮时,我得到空视图。我跟着this tutorial我不知道是什么问题。我坚持下去。

UPDATE1

在网络中检查

Network Image

更新2

正如我所建议的那样$.ajax尝试了以下结果

Resulted image

更新3

更改JS

$('#myid').click(function(e) {
 e.preventDefault();
 var keys = $('#grid').yiiGridView('getSelectedRows');

// alert(keys);

 $.ajax({     
  url: '<?= URL::toRoute(["ogpheader/viewsetpdf"])?>',
  dataType: 'json',
  data:{keylist: keys},
   type: 'post',
  success:function(data) {
    alert('Done')
  }

});

结果是

Console Image

任何帮助都将受到高度赞赏。

4 个答案:

答案 0 :(得分:2)

POST方法需要csrf标记,因此您必须将_csrf标记作为参数传递

$.ajax({
    url: 'ogpheader/viewsetpdf',
    type: 'post',
    dataType: 'json',
    data: {
        keylist: keys,
        _csrf: '<?=Yii::$app->request->getCsrfToken()?>'
    },
    success: function(data) {
        console.log(data);
    }
});

或者您可以通过将其添加到控制器来禁用csrf valdation

public function beforeAction()
    {      
        if ($this->action->id == 'viewsetpdf') {
            Yii::$app->controller->enableCsrfValidation = false;
        }
        return true;
    }

或者最简单的方法就是将POST更改为GET

答案 1 :(得分:2)

更改控制器并查看返回值,可能是csrf令牌缺少您输出为空的原因

public function actionViewsetpdf()
{
    if(isset($_POST['keylist']))
    {
        $keys = json_decode($_POST['keylist']);
        print_r($keys);
    }
    else{
        echo 'no data';
    }
    exit();
}

答案 2 :(得分:1)

$.post()的参数有限。使用$.ajax()。您还需要添加e.preventDefault()以停止从a代码

重定向
$(document).ready(function () {      

 $('#myid').click(function(e) {
     e.preventDefault();
     var keys = $('#grid').yiiGridView('getSelectedRows');

    // alert(keys);

     $.ajax({     
      url: '<?php echo URL::toRoute(["ogpheader/viewsetpdf"]); ?>',
      dataType: 'json',
      data:{keylist: keys},
       type: 'post',
      success:function(data) {
        alert('Done')
      }

 });
}) });

答案 3 :(得分:0)

使用以下js

<?php
$url = Url::toRoute(['ogpheader/viewsetpdf']);
$this->registerJs(<<< JS
$(document).ready(function () {
   $('#myid').click(function() {
      var keys = $('#grid').yiiGridView('getSelectedRows');
      $.ajax({
         url: '$url',
         data: {keylist: keys},
         type: "POST",
         dataType: 'json',
         success:function(data) {
            alert('Done');
         }
      });
   });
});
JS
); ?>