Yii2 GridView ActionColumn使用POST传递id参数失败求助
解决Yii2 GridView中Html::a() POST请求无法传递id参数的问题
我明白你遇到的问题了——明明给Html::a()设置了data-method='post',也在URL里带了id参数,但控制器就是拿不到这个值。这其实是Yii2的一个小细节:当你用data-method='post'时,Yii会通过JS生成一个隐藏表单来发起POST请求,但默认情况下,这个表单只会自动带上CSRF令牌,不会把URL里的查询参数自动转换成POST参数。
下面给你几个可行的解决方案:
方案1:通过data-params传递POST参数
这是最规范的做法,直接在data数组里添加params字段,把需要传递的参数写进去,Yii会自动把这些参数生成隐藏的表单字段:
[ 'class' => 'yii\grid\ActionColumn', 'template' => '{update} {delete}', 'buttons' => [ 'update' => function($url, $model){ return Html::a( '<span class="glyphicon glyphicon-edit"></span>', ['c-update'], // 这里可以不用在URL里写id,params会处理 [ 'data' => [ 'method' => 'post', 'params' => ['id' => $model->id], // 关键:在这里指定POST参数 ], ] ); } ] ]
然后在你的c-update控制器动作里,就可以通过POST获取id了:
public function actionCUpdate() { $id = Yii::$app->request->post('id'); // 后续逻辑... }
方案2:从GET参数中获取(快速临时方案)
如果你只是想快速拿到id,其实URL里的id参数还是会被放在GET请求里,哪怕你用POST方法发起请求。所以也可以直接从GET里取:
$id = Yii::$app->request->get('id');
不过这种方式本质上还是GET传递参数,只是请求方法是POST,如果你确实需要把id作为POST参数传递,还是推荐方案1。
为什么原来的代码不行?
再补充解释一下:你原来的代码把id写在URL的路由参数里,Yii生成的链接会是类似/controller/c-update?id=xxx,但当JS把这个链接转为POST表单时,只会提交表单里的CSRF令牌,不会把URL中的id=xxx提取出来加到表单里,所以控制器的POST参数里自然就没有id了。
内容的提问来源于stack exchange,提问作者Toma Tomov
相关产品推荐
相关产品推荐

