Yii2 ajax 请求返回错误 404 和 400

Yii2 ajax request returning Error 404 and 400

我的表单元素

<?= $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);
}

我收到一个没有 id 的 404 响应作为投诉。 当我将 ajax .post 更改为 .get 时,我收到 400 响应

谢谢

当您创建像 actionGetbatchdata($id) {} 这样的函数时,您必须将 id 添加为 GET 参数(通过将其添加到 url)。因此,当您使用 $.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() 包含一个值并且您的操作中的代码 returns 有效结果。

检查您的控制器行为方法并确保其中列出了 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'],
            ],
        ],
    ];
}

确保控制器操作使用驼峰式大小写

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);
        });
    ']); ?>