
Yii2 中 GridView 分页跳转 404 是因分页默认使用当前视图对应动作(如 view)作为基础 URL,而实际数据列表应由 index 动作提供;需显式配置 Pagination::url 或改用 index 动作渲染列表页。
yii2 中 gridview 分页跳转 404 是因分页默认使用当前视图对应动作(如 `view`)作为基础 url,而实际数据列表应由 `index` 动作提供;需显式配置 `pagination::url` 或改用 `index` 动作渲染列表页。
该问题的根本原因在于:GridView 的分页组件会自动推导分页请求的目标路由为当前页面所在控制器动作(即 products/view),但你的 actionView() 并非标准的数据列表入口——它本应只展示单条记录详情,而分页逻辑要求后端持续响应 /products/index?page=2&per-page=3 这类请求。当前点击“第2页”时生成的 URL 是 http://localhost/testyii/frontend/web/products/view?page=2&per-page=3,而 actionView() 并未设计为处理带分页参数的批量数据请求,且该 URL 路由在控制器中未被正确映射或未启用,最终导致 Apache/Nginx 返回 404。
✅ 正确做法是:将数据列表页迁移到标准的 index 动作中,并确保路由与视图匹配。以下是完整修复步骤:
1. 修改控制器:使用 actionIndex() 替代 actionView()
// frontend/controllers/ProductsController.php
public function actionIndex()
{
$query = WmProducts::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 3,
],
'sort' => [
'defaultOrder' => [
'id' => SORT_DESC,
],
],
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
}
⚠️ 注意:不要在
actionView()中渲染分页列表——view动作应仅用于显示单个模型(如$model = $this->findModel($id))。
2. 更新视图文件路径与内容
将原 views/products/view.php 中的 GridView 代码移至 views/products/index.php,并推荐启用 Pjax 提升体验:
<?php use yii\grid\GridView;
use yii\widgets\Pjax;
Pjax::begin(['enablePushState' => false]); // 避免 URL 地址栏变化干扰(可选)
echo GridView::widget([
'dataProvider' => $dataProvider,
'tableOptions' => ['class' => 'table table-hover'],
'columns' => [
'id',
'name:ntext',
'wholesale_price',
'is_retail:boolean',
'distributor_price',
// 更多列...
],
]);
Pjax::end();
3. (进阶)若必须保留在 view 页面中分页(不推荐)
可通过手动指定分页 URL 实现,但需额外路由支持:
// 在 actionView() 中配置 DataProvider:
$dataProvider = new ActiveDataProvider([
'query' => $WmProducts,
'pagination' => [
'pageSize' => 3,
'route' => 'products/index', // 显式指定分页请求发送到 index 动作
],
]);
同时确保 products/index 路由已启用(默认 Yii2 已支持),且 actionIndex() 已按第1步实现。
✅ 验证要点
- 访问
http://localhost/testyii/frontend/web/products/index应正常显示带分页的 GridView; - 点击页码时 URL 变为
.../index?page=2&per-page=3,而非.../view?...; - 检查 Web 服务器日志或 Yii 日志,确认无
Invalid Route或Missing Action报错。
? 总结:Yii2 的分页机制高度依赖「动作-视图」约定。坚持使用 index 动作承载列表 + 分页,是避免此类 404 的最佳实践;强行在 view 中实现分页不仅违背 RESTful 设计,还易引发路由、缓存及 SEO 问题。











