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

Laravel提交POST数据后CategoryController无法跳转问题求助

问题:AJAX提交表单后Laravel的redirect跳转不生效

在Laravel项目中,create.blade.php的表单通过AJAX提交POST数据到CategoryController的store方法,尝试用return redirect()->route('categories.index')->with('message','Category added successfully');跳转至分类列表页,但提交后页面始终无跳转动作,已确认路由路径存在,网络请求状态显示正常。


相关代码

CategoryController.php

class CategoryController extends Controller
{
    public function index(Request $request){
        $categories = Category::where([
            ['name', '!=', Null],
            [function ($query) use ($request) {
                if (($keyword = $request->keyword)) {
                    $query->orWhere('name', 'LIKE', '%' . $keyword . '%')
                        ->get();
                }
            }]
        ])->paginate(6);
        return view('admin.category.list',compact('categories'));
    }

    public function create(){
        return view('admin.category.create');
    }

    public function store(Request $request){
        $validator = Validator::make($request->all(),[
            'name' => 'required',
            'slug' => 'required|unique:categories'
        ]);
        if($validator->passes()){
            $category = new Category();
            $category->name = $request->name;
            $category->slug = $request->slug;
            $category->status = $request->status;
            $category->save();

            return redirect()->route('categories.index')->with('message','Category added successfully');
            return response()->json([
                'status' => true,
                'message' => 'Category added successfully'
            ]);

        } else{
            return response()->json([
                'status' => false,
                'errors' => $validator->errors()
            ]);
        }
    }
}

web.php

Route::group(['prefix'=>'admin'], function(){
Route::group(['middleware' => 'admin.guest'], function(){
    Route::get('/login', [AdminLoginController::class,'index'])->name('admin.login');
    Route::post('/authenticate', [AdminLoginController::class,'authenticate'])->name('admin.authenticate');
});
Route::group(['middleware' => 'admin.auth'], function(){
    Route::get('/dashboard', [HomeController::class,'index'])->name('admin.dashboard');
    Route::get('/logout', [HomeController::class,'logout'])->name('admin.logout');

    //Category Routes
    Route::get('/categories', [CategoryController::class,'index'])->name('categories.index');
    Route::get('/categories/create', [CategoryController::class,'create'])->name('categories.create');
    Route::post('/categories', [CategoryController::class,'store'])->name('categories.store');

    Route::post('/upload-temp-image', [TempImagesController::class, 'create'])->name('temp-images.create');

    Route::get('/getSlug', function(Request $request){
        $slug = '';
        if(!empty($request->title)){
            $slug = Str::slug($request->title);
        }
        return response()->json([
            'status'=>true,
            'slug'=>$slug
        ]);
    })->name('getSlug');
});
});

create.blade.php(核心部分)

<form action='' method="POST" id="categoryForm" name="categoryForm">
    <!-- 表单内容省略 -->
    <div class="pb-5 pt-3">
        <input type="submit" value="Create" class="btn btn-primary">
        <a href="" class="btn btn-outline-dark ml-3">Cancel</a>
    </div>
</form>
<script>
    $('#categoryForm').submit(function(event){
        event.preventDefault();
        var element = $(this)
        $("button[type=submit]").prop('disabled',true)
        $.ajax({
            url:'{{ route("categories.store") }}',
            type: 'post',
            data: element.serializeArray(),
            dataType: 'json',
            success: function(response){
                $("button[type=submit]").prop('disabled',false)
                if(response['status'] == true){
                    $("#name").removeClass('is-invalid').siblings('p').removeClass('invalid-feedback').html("")
                    $("#slug").removeClass('is-invalid').siblings('p').removeClass('invalid-feedback').html("")
                } else{
                    var errors = response['errors']
                    // 错误处理逻辑省略
                }
            },
            error: function(jqXHR, exception){
                console.log("Something went wrong")
            }
        })
    })
</script>

问题原因

  1. 控制器代码逻辑错误:redirect语句后紧跟return response()->json(),由于return会终止函数执行,redirect代码永远不会被触发。
  2. AJAX特性限制:AJAX是异步请求,后端返回的redirect响应只会被AJAX回调接收,不会自动触发浏览器页面跳转,必须通过前端JS手动处理。

修复方案

1. 修正CategoryController的store方法

删除无效的redirect语句,返回包含跳转路径的JSON响应:

public function store(Request $request){
    $validator = Validator::make($request->all(),[
        'name' => 'required',
        'slug' => 'required|unique:categories'
    ]);
    if($validator->passes()){
        $category = new Category();
        $category->name = $request->name;
        $category->slug = $request->slug;
        $category->status = $request->status;
        $category->save();

        // 返回JSON,包含跳转路径和提示信息
        return response()->json([
            'status' => true,
            'message' => 'Category added successfully',
            'redirect_url' => route('categories.index')
        ]);

    } else{
        return response()->json([
            'status' => false,
            'errors' => $validator->errors()
        ]);
    }
}

2. 修改前端AJAX的success回调

在成功响应后,通过JS手动跳转到目标页面:

<script>
    $('#categoryForm').submit(function(event){
        event.preventDefault();
        var element = $(this)
        $("input[type=submit]").prop('disabled',true) // 修正选择器:原表单是input提交按钮
        $.ajax({
            url:'{{ route("categories.store") }}',
            type: 'post',
            data: element.serializeArray(),
            dataType: 'json',
            success: function(response){
                $("input[type=submit]").prop('disabled',false)
                if(response['status'] == true){
                    $("#name").removeClass('is-invalid').siblings('p').removeClass('invalid-feedback').html("")
                    $("#slug").removeClass('is-invalid').siblings('p').removeClass('invalid-feedback').html("")
                    // 手动触发页面跳转
                    window.location.href = response.redirect_url;
                } else{
                    var errors = response['errors']
                    // 错误处理逻辑保留
                }
            },
            error: function(jqXHR, exception){
                console.log("Something went wrong")
            }
        })
    })
</script>

3. 可选:在列表页显示成功提示

在admin.category.list.blade.php中添加提示渲染代码:

@if(session('message'))
    <div class="alert alert-success">
        {{ session('message') }}
    </div>
@endif

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:44:51