【问题标题】:Unable to post the data from view to controller in Yii2无法将数据从视图发布到 Yii2 中的控制器
【发布时间】:2019-05-24 17:03:11
【问题描述】:

我正在处理Yii2。我有一个带有复选框的gridview,在单击按钮时,我将其重定向到使用ajax 的动作控制器。

 <?= Html::a('Disconnect', ['dco'], ['class' => 'btn btn-success', 'id'=>'dco']) ?>

<?php Pjax::begin(); ?>    
        <?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [


        ['class' => 'yii\grid\CheckboxColumn', 'checkboxOptions' => function($d) {
            return ['value' => $d['msn']];
        }],


        'ref_no',
        'dept_code:ntext',
        'dept_name:ntext',

        'allowed_units',
        'msn',

        'units_consumed',
        [
            'label' => 'Disconnected',
            'attribute' => 'disconnected',
            'format'=>'raw',
            'contentOptions' => ['style'=>'text-align:center'],
            'value' => function($model){
                return $model->disconnected == 1 ? '<span class="glyphicon glyphicon-ok text-success"></span>' : '<span class="glyphicon glyphicon-remove text-danger"></span>';
            },
            'filter' => Html::activeDropDownList($searchModel, 'disconnected', [''=>'All','1'=>'Yes','0'=>'No'], ['class' => 'form-control']),
        ],

        'diconnected_at',
        'reconnected_at',
        'active_energy_total_m',


        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>
<?php Pjax::end(); ?>

JS

<?php

$DCOurl = Url::toRoute(['/hecolog/dco']);

$script = <<< JS
$(document).ready(function () {  



 //DCO 
 $('#dco').on('click',function(e) {


       e.preventDefault();    
 var strValue = "";        
    $('input[name="selection[]"]:checked').each(function() {

    if(strValue!=="")
        {
        strValue = strValue + " , " + this.value;

        }
    else 
       strValue = this.value;     

});       

 $.ajax({
    url: '$DCOurl',
    type: 'POST',
    dataType: 'json',
    data: {data:strValue},         
    success: function(data) {
       alert(data);
    }
 });


 });
});
JS;
$this->registerJs($script, static::POS_END);
?>

但是当我单击断开连接按钮时,它不会重定向到我的控制器。在控制台中它给了我Not Found (#404): Page not found.

更新 1

我已经更新了如下所示的 ajax 调用

$.ajax({
    url: $DCOurl, // removed the inverted commas ''
    type: 'POST',
    dataType: 'json',
    data: {data:strValue},         
    success: function(data) {
       alert(data);
    }
 });

控制器

 public function actionDco()
{
    if(Yii::$app->request->isAjax && Yii::$app->request->post())
    {
        $data = explode(',',$_POST['data']);

        var_dump($data);
        die();
    }
    else{
        $this->redirect('index');
    }




}

按照建议更新代码后,我可以进入我的控制器但仍然无法获取数据

在控制台我收到错误Uncaught SyntaxError: Invalid regular expression flags

更新 2

下面是我的观点的代码

<?php

use yii\helpers\Html;
use yii\grid\GridView;
use yii\widgets\Pjax;
use yii\helpers\Url;
use yii\web\JqueryAsset;
/* @var $this yii\web\View */
/* @var $searchModel common\models\HescologSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'DCO / RCO';
$this->params['breadcrumbs'][] = $this->title;
?>
<section class="content-header">
<h1>DCO / RCO List</h1>
</section>
<section class="content">
<div class="box">
    <div class="box-body">


<p>

    <?= Html::a('Disconnect', ['dco'], ['class' => 'btn btn-success', 'id'=>'dco']) ?>
    <?= Html::a('Re-Disconnect', ['rco'], ['class' => 'btn btn-info','id'=>'rco']) ?>
</p>

 <?php Pjax::begin(); ?>
        <div class="pre-scrollable">
        <?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [


        ['class' => 'yii\grid\CheckboxColumn', 'checkboxOptions' => function($d) {
            return ['value' => $d['msn']];
        }],


        'ref_no',
        'dept_code:ntext',
        'dept_name:ntext',

        'allowed_units',
        'msn',

        'units_consumed',
        [
            'label' => 'Disconnected',
            'attribute' => 'disconnected',
            'format'=>'raw',
            'contentOptions' => ['style'=>'text-align:center'],
            'value' => function($model){
                return $model->disconnected == 1 ? '<span class="glyphicon glyphicon-ok text-success"></span>' : '<span class="glyphicon glyphicon-remove text-danger"></span>';
            },
            'filter' => Html::activeDropDownList($searchModel, 'disconnected', [''=>'All','1'=>'Yes','0'=>'No'], ['class' => 'form-control']),
        ],

        'diconnected_at',
        'reconnected_at',
        'active_energy_total_m',


        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>
        </div>
<?php Pjax::end(); ?>

    </div>
</div>
</section>
<?php

$DCOurl = Url::toRoute(['/hescolog/dco']);
$RCOurl = Url::toRoute(['/hescolog/rco']);

$script = <<< JS
$(document).ready(function () {      
//DCO 
 $('#dco').on('click',function(e) {


       e.preventDefault();    
 var strValue = "";        
    $('input[name="selection[]"]:checked').each(function() {

    if(strValue!=="")
        {
        strValue = strValue + " , " + this.value;

        }
    else 
       strValue = this.value;     

});



$.ajax({
    url: $DCOurl,
    type: 'POST',
    dataType: 'json',
    data: {data:strValue},         
    success: function(data) {
       alert(data);
    }
 });


 });

 $('#rco').on('click',function(e) {

 e.preventDefault();    
 var strValue = "";        
    $('input[name="selection[]"]:checked').each(function() {

    if(strValue!=="")
        {
        strValue = strValue + " , " + this.value;

        }
    else 
       strValue = this.value;     

  });

  $.ajax({
    url: '$RCOurl',
    type: 'POST',
    dataType: 'json',
    data: {data:strValue},         
    success: function(data) {
       alert(data);
    }
 });
 });

 });    
 JS;
 $this->registerJs($script, static::POS_END);
 ?>

我一定是做错了我不理解的事情

任何帮助将不胜感激。

【问题讨论】:

  • 你不应该在你的行动中使用die(),只是返回响应。
  • @rob006 它不在if(Yii::$app-&gt;request-&gt;isAjax &amp;&amp; Yii::$app-&gt;request-&gt;post()) 条件内
  • 你怎么知道?您的 AJAX 请求需要 JSON 休止符,但您的操作返回垃圾并且没有正确结束。
  • @rob006 因为它击中了 else 部分
  • 如果你使用的是1.9.0之前的jQuery版本,你应该使用type。我认为这不是你的情况。如果您使用的是最新的 Yii 版本,它默认包含 Jquery 3.3.1,通过 yii\web\JqueryAsset 在您的 ajax 请求中将其更改为 method,并检查它是否开始输入 if 条件

标签: javascript jquery ajax gridview yii2


【解决方案1】:

首先url:'$DCOurl' 是正确的,并且 url 必须是单个或 双引号。所以你有一个找不到问题:

  • 您的项目是在 htdocs 或 www 后跟 /inventory-web/backend/ 还是有更多目录?您使用相对 url,因此 url 将用于 ex:localhost/inventory-web/backend/web/ ...
  • ajax 类型 'POST' 应该与行为['verbs']['actions'] 匹配(如果您已设置)
  • 检查控制器文件名、类名和命名空间

【讨论】:

  • 这不是解决或解决问题的答案
  • 我确定您需要修复未找到的问题。如果动作有参数或在上面提供的情况下,当参数丢失时会导致问题
【解决方案2】:

首先,如果您正在处理 Ajax 请求,则无法进行重定向:

public function actionDco()
{
    Yii::$app->response->format = Response::FORMAT_JSON;
    $rv=[];
    if(Yii::$app->request->isAjax && Yii::$app->request->post())
    {
        $data = explode(',',$_POST['data']);

        $rv["infos"]=$data;
        $rv["status"]='gotData';
    }
    else{
        $rv["url"]=Url::to('index');
        $rv["status"]='redirect';

    }
    return $rv;
}

关于JS错误,而不是:

$.ajax({
    url: $DCOurl,
    type: 'POST',
    dataType: 'json',
    data: {data:strValue},         
    success: function(data) {
       alert(data);
    }
 });

$DCOurl 周围添加引号并管理来自ajax 调用的返回值

$.ajax({
    url: "$DCOurl",
    type: 'POST',
    dataType: 'json',
    data: {data:strValue},         
    success: function(data) {
       if(data.status=='gotData'){
           alert(data.infos);
       }
       if(data.status=='redirect'){
           window.location.href=data.url;
       }
    }
 });

【讨论】:

  • 即使声明存在,它也永远不会重定向到 ajax 请求,它永远不会转到 else 部分
  • @MuhammadOmerAslam 是的,你是对的,它没有进入 if 部分。获取输出 '{"url":"index","status":"redirect"}'
  • @Ivan 我也收到错误http://localhost:800/inventory-web/backend/web/hecolog/dco 404 (Not Found)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
相关资源
最近更新 更多