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

Laravel分类下拉筛选失效,页面重复显示问题求助

Laravel分类筛选AJAX展示问题解决

问题

在Laravel中实现分类下拉筛选帖子功能,选择分类后浏览器出现重复超长页面,同时不清楚如何通过jQuery从控制器正确获取并展示数据。

核心原因

当前控制器无论是否为AJAX请求,都返回完整的页面视图(包含布局、导航等所有内容)。AJAX成功后把整个页面内容塞进#main_posts容器,导致页面嵌套,出现重复的布局结构,最终显示超长重复页面。

解决方案

1. 优化控制器逻辑

修改控制器,区分AJAX请求和普通请求:AJAX请求仅返回帖子列表的片段视图,普通请求返回完整页面。同时修正模型名(Laravel模型名需大写),简化查询逻辑:

// PostsController.php
class PostsController extends Controller
{
    public function index(Request $request){
        $kategories = Kategori::all();
        // 统一查询逻辑,避免重复代码
        $query = Post::query();
        if ($request->has('category_id')) {
            $query->where('kategori_id', $request->input('category_id'));
        }
        $posts = $query->get();

        // 判断是否为AJAX请求
        if ($request->ajax()) {
            // 返回仅包含帖子列表的片段视图
            return view('main.posts-list', compact('posts'));
        }

        // 普通请求返回完整页面
        return view('main.posts', compact('posts', 'kategories'));
    }
}

2. 创建帖子列表片段视图

新建resources/views/main/posts-list.blade.php,把原来主视图中帖子循环的部分移到这里:

<!-- main/posts-list.blade.php -->
@foreach($posts as $p)
<div class="card p-4 rounded-4 mb-4" style="background-color:#171615">
    <article class="mb-5">
        <div class="d-flex">
            <h1><i class="bi bi-person-circle"></i></h1> 
            <h5 class="ms-2 card-title">{{ $p->penanya }}</h5>
            <h5 class="ms-1 card-title">Posted 2 Days ago</h5>
        </div>
        <h4 class="mt-2">{{ $p->judul }}</h4>
        <text>{{ $p->pertanyaan }}</text>
        <div class="mt-3">
            <a href="{{ url('home',$p->slug) }}" class="link-info">See Answer</a>
        </div>
    </article>
</div>
@endforeach

3. 修改主视图

在主视图中引入刚才创建的片段视图,同时确保JS逻辑正确:

<!-- main/posts.blade.php -->
@extends('layouts.main')

@section('dropdown')
    <div class="dropdown p-1">
        <select name="category" id="category" class="form-control">
            <option value="" class="text-center">- 选择分类 -</option>
            @foreach($kategories as $k)
                <option value="{{ $k->id }}" class="text-center">{{ $k->nama }}</option>
            @endforeach
        </select>
    </div>
@endsection

@section('container')
    <div id="main_posts">
        <!-- 引入帖子列表片段 -->
        @include('main.posts-list')
    </div>
@endsection

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $('#category').on('change', function() {
        var category_id = $(this).val();
        $.ajax({
            url: '/home',
            type: 'GET',
            data: { category_id: category_id },
            success: function(data) {
                $('#main_posts').html(data);
            },
            error: function() {
                $('#main_posts').html('<p>加载失败,请重试</p>');
            }
        });
    });
});
</script>

4. 额外优化点

  • 模型名统一大写:posts改为Post(确保模型文件名为Post.php)
  • 移除控制器中未使用的$provinsi和$posted变量
  • 空分类时无需清空容器,直接请求所有帖子即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:35:30