You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2 GridView分页按钮失效,点击后出现404错误如何解决?

Yii2 GridView分页按钮点击后404问题解决

问题现象

使用Yii2的GridView展示数据时,点击分页按钮(如第2页),页面跳转到http://localhost/testyii/frontend/web/products/view?page=2&per-page=3,但服务器返回404 Not found错误。

原代码

控制器代码

public function actionView()
{
    $WmProducts = WmProducts::find();
    $dataProvider = new ActiveDataProvider ([
        'query' =>$WmProducts,
        'pagination' => ['pageSize'=>3],  
        ]);
    return $this->render('view', [
        'dataProvider' =>$dataProvider]);                     
}

视图代码

<?php
use yii\grid\GridView;
use yii\data\ActiveDataProvider;
use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\widgets\Pjax;
use app\models\Client;
?>
<?php
echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        'id',
         [
            'attribute' => 'name',
            'format' => 'text'
         ],

         [
            'attribute' => 'wholesale_price',
            'format' => 'text'
         ],
         [
            'attribute' => 'is_retail',
            'format' => 'text'
         ],
         [
            'attribute' => 'distributor_price',
            'format' => 'Text'
         ]

        ]
]);
?>

问题原因

Yii2默认路由规则中,view动作属于详情页动作,框架默认要求该动作接收主键参数(如id)来查询单条数据。当用view动作渲染列表并传递分页参数时,框架无法匹配到正确的路由规则,因此返回404错误。

解决方法

方法1:改用标准列表页动作(推荐)

将控制器中的actionView改为actionIndex——index是Yii2默认的列表页动作,不需要主键参数:

修改后的控制器代码:

public function actionIndex()
{
    $WmProducts = WmProducts::find();
    $dataProvider = new ActiveDataProvider ([
        'query' =>$WmProducts,
        'pagination' => ['pageSize'=>3],  
    ]);
    return $this->render('index', [
        'dataProvider' =>$dataProvider]);                     
}

同时将视图文件重命名为index.php,访问路径改为http://localhost/testyii/frontend/web/products/index,分页按钮即可正常工作。

方法2:修改路由规则,允许view动作无主键访问

如果必须保留view动作,在config/web.php的urlManager配置中添加自定义路由规则:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        // 自定义规则:允许products/view不带id参数访问
        'products/view' => 'products/view',
        // 原有默认规则(保持不变)
        '<controller:\w+>/<id:\d+>' => '<controller>/view',
        '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    ],
],

注意要将自定义规则放在默认规则前面,避免被覆盖。

附加检查

确保Web服务器已配置URL重写:

  • Apache:开启mod_rewrite模块,项目根目录和web目录下存在.htaccess文件
  • Nginx:配置文件中添加重写规则,将请求导向web/index.php

内容的提问来源于stack exchange,提问作者Pavalion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:06:25