【问题标题】:Unable to get the response from ajax call in yii2无法从 yii2 中获取 ajax 调用的响应
【发布时间】:2017-11-11 06:02:28
【问题描述】:

我有一个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我不知道是什么问题。我坚持下去。

更新1

在网络中检查时

更新 2

按照建议,我已尝试使用 $.ajax,结果如下

更新 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')
  }

});

结果是

任何帮助将不胜感激。

【问题讨论】:

  • 你在网络中调试过吗?试试 $.ajax
  • @PrasannaVenkatesh 请查看更新
  • 你的 $.post 应该改为 $.ajax
  • 你能把url: '&lt;?= URL::toRoute(["ogpheader/viewsetpdf"])?&gt;',改成url: '&lt;?= \yii\helpers\Url::to(["/ogpheader/viewsetpdf"])?&gt;',并在第一行viewtestpdf 添加echo "hello"; exit;,然后检查控制台,你添加的控制台图像包含整个php参数中的声明不应该是,你也应该使用$this-&gt;registerJs()yii\web\View::POS_END
  • 我已根据您的建议更改了代码,并添加了$this-&gt;registerJs() 现在我有一个异常ArgumentCountError 详细信息是oo few arguments to function yii\web\View::registerJs(), 0 passed

标签: php jquery ajax gridview yii2


【解决方案1】:

更改控制器并查看返回的内容,可能是 csrf 令牌丢失了导致输出为空的原因

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

【讨论】:

  • 显示no data
【解决方案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

【讨论】:

  • 我怀疑,你都试过了吗,返回什么错误?
  • 在哪里添加这个beforeAction方法?
  • 当添加 _csrf: '&lt;?=Yii::$app-&gt;request-&gt;getCsrfToken()?&gt;' 并刷新页面时出现错误 Undefined variable: app
  • 确保有“use Yii;”在命名空间“ogpheader\controllers;”之后如果没有,添加它
  • use yii\helpers\Html; use yii\grid\GridView; use yii\helpers\Url; use app\models\User; use yii\widgets\DetailView; use Yii; 这些是我的命名空间
【解决方案3】:

$.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')
      }

 });
}) });

【讨论】:

  • 请查看更新 2 我已将完整视图放在url
  • 尝试将e.preventdefault()改为e.preventDefault()
  • 现在在网络中将e.preventdefault(); 更改为e.preventDefault(); 我收到404
  • 不...仅在 ajax 中更改
  • 试过但还是一样Not Found (#404): Page not found.
【解决方案4】:

在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
); ?>

【讨论】:

  • 试过你的代码。但我又得到了空白页
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2021-02-07
  • 2013-12-06
  • 2020-02-17
  • 1970-01-01
相关资源
最近更新 更多