这是我的代码:
$(document).on('change', '#tblhotel-int_zone_id', function(e){ var zoneId = $(this).val(); var form_data = { zone: zoneId }; $.ajax({ url: "state", type: "POST", data: form_data, success: function(response) { alert(response); } }); });
由此可见:
错误请求(#400):无法验证您的数据提交.
我已经有了= Html::csrfMetaTags() ?>
.我该如何解决这个问题?
使用:
var csrfToken = $('meta[name="csrf-token"]').attr("content"); $.ajax({ url: 'request', type: 'post', dataType: 'json', data: {param1: param1, _csrf : csrfToken}, });
更多细节:Yii2:使用csrf令牌
注意:请参阅Skullcrasher的答案,以正确的方式解决问题,因为我的答案建议禁用跨站点请求伪造.
你有enableCsrfValidation的问题.要了解更多信息,请阅读此处.
要禁用CSRF,请将此代码添加到控制器:
public function beforeAction($action) { $this->enableCsrfValidation = false; return parent::beforeAction($action); }
这将禁用所有操作.您可能应该根据$操作仅为特定操作禁用它.
在布局的底部添加此代码:
<script> $.ajaxSetup({ data: <?= \yii\helpers\Json::encode([ \yii::$app->request->csrfParam => \yii::$app->request->csrfToken, ]) ?> }); </script>
正如Mihai P.所说,你的问题是CSRF验证.您也可以禁用行为验证,但这不是一个好的解决方案.
由于您的Ajax请求中存在验证问题,您还可以使用Yii JavaScript函数将CSRF令牌添加到您在Ajax请求中发送的formdata.
只需尝试将令牌添加到表单数据中,如下所示:
var form_data = { zone: zoneId, _csrf: yii.getCsrfToken() };
我希望这有帮助,因此您不必禁用CSRF验证.
除了手动添加CSRF令牌之外,您还可以检查请求中是否设置了X-CSRF头.