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>
问题原因
- 控制器代码逻辑错误:
redirect语句后紧跟return response()->json(),由于return会终止函数执行,redirect代码永远不会被触发。 - 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
相关产品推荐
相关产品推荐

