Yii2 ajax请求返回错误404和400

时间:2015-08-10 13:43:20

标签: ajax http-status-code-404 yii2

我的表单元素

<?= $form->field($model, 'batch_id')->dropDownList($BatchOptions, ['prompt'=>'Select Batch','onchange'=>'
            $.post( "'.Url::toRoute('week/getbatchdata').'", { id: $(this).val() } )
                        .done(function( data ) {
              var BatchData = $.parseJSON(data);
              console.log(BatchData);
            });
        ']); ?>

我的控制器

public function actionGetbatchdata($id)
{
    $model = $this->findModel($id);
    $batch = $model->getBatch();
    return \yii\helpers\Json::encode($batch);
}

我得到404回复,没有身份证明作为投诉。 当我将ajax .post更改为.get时,我得到400响应

由于

2 个答案:

答案 0 :(得分:0)

当您创建actionGetbatchdata($id) {}之类的函数时,您必须将id添加为GET参数(通过将其添加到网址)。因此,当您使用$.post()时,您将id作为POST参数发送。

我建议进行以下更改:

public function actionGetbatchdata($id)
{
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

    $model = $this->findModel($id);
    return $model->getBatch();
}

通过将响应格式设置为json来消除json编码服务器端的需要,然后再次json解码客户端。 Js改变了:

$.get(
    "' . Url::toRoute('week/getbatchdata') . '",
    { id: $(this).val() }
)
.done(function( data ) {
    console.log(data);
}

请确保$(this).val()包含值,并且操作中的代码会返回有效结果。

答案 1 :(得分:0)

检查控制器行为方法并确保在那里列出get-batch-data

    public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['get-batch-data'],
            'rules' => [
                [
                    'actions' => ['get-batch-data'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

Makre肯定会使用驼峰外壳进行控制器操作

public function actionGetBatchData()
{
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $id = Yii::$app->request->post('id');
    $model = $this->findModel($id);
    return $model->getBatch();
}

您的表单元素

<?= $form->field($model, 'batch_id')->dropDownList($BatchOptions, ['prompt'=>'Select Batch','onchange'=>'
        $.post( "'.Url::toRoute('week/getBatchData').'", { id: $(this).val() } )
                    .done(function( data ) {
          var BatchData = $.parseJSON(data);
          console.log(BatchData);
        });
    ']); ?>