Yii2 Gii生成CRUD访问view等操作报400缺少id_kategori参数如何解决
结论
不需要修改数据表的id_kategori列以及其他表的自定义主键列名,该问题是Yii 2配置不匹配导致的,按以下步骤修改即可完全解决。
问题根因
错误的核心原因是两处默认配置和你实际的主键名不匹配:
- Gii生成CRUD代码时,默认按照主键名为
id的规则生成URL参数,GridView的操作按钮默认也只会传递名为id的主键参数,和你控制器动作要求的id_kategori参数名不符 - 你的
Kategori模型类没有显式声明主键,Yii默认将主键识别为id,无法匹配你实际的主键字段id_kategori
修复步骤
1. 显式声明模型主键
打开models/Kategori.php文件,显式指定主键字段:
class Kategori extends \yii\db\ActiveRecord { // 新增这一行声明主键 public $primaryKey = 'id_kategori'; // 原有代码保持不变 }
2. 修正列表页操作按钮的参数
打开views/kategori/index.php,找到GridView配置中的ActionColumn部分,修改URL生成规则,传递正确的参数名:
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ // 原有其他列配置保持不变 [ 'class' => 'yii\grid\ActionColumn', 'urlCreator' => function ($action, $model, $key, $index) { return \yii\helpers\Url::to([$action, 'id_kategori' => $model->id_kategori]); } ], ], ]); ?>
3. 修正新增成功后的跳转逻辑
打开控制器中的actionCreate方法,修改跳转时传递的参数名:
public function actionCreate() { $model = new Kategori(); if ($this->request->isPost && $model->load($this->request->post()) && $model->save()) { // 将原来的'id'改为'id_kategori' return $this->redirect(['view', 'id_kategori' => $model->id_kategori]); } return $this->render('create', [ 'model' => $model, ]); }
可选优化
如果要简化URL格式,可以在frontend/config/main.php的urlManager组件中新增自定义路由规则:
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ 'kategori/<action:view|update|delete>/<id_kategori:\d+>' => 'kategori/<action>', ], ],
配置后生成的URL会自动适配id_kategori参数,无需在每个生成URL的地方手动指定参数名。
内容的提问来源于stack exchange,提问作者Dedi Setiawan
相关产品推荐
相关产品推荐

