Laravel:通过AJAX传递数组至控制器后返回携带该数组的指定视图问题
我明白你的问题了——你想通过AJAX把数组传给Laravel控制器,然后让控制器返回一个带着这个数组的视图页面,而不是JSON响应,之前用window.location跳转没法携带数组的问题确实挺头疼的。其实这里有几个可行的方案,我给你详细拆解下:
方案1:放弃AJAX,用表单提交(最直接简单)
毕竟你最终的目的是跳转页面,AJAX本来是为无刷新请求设计的,用表单提交反而更贴合这个场景。不管是静态还是动态生成的数组,都能通过隐藏字段传递:
前端代码(动态数组场景)
$(function(){ $('#but').click(function(e) { e.preventDefault(); // 阻止默认按钮行为 let arr = [1, 2, 3]; // 你的目标数组 // 动态创建表单 let form = $('<form>', { action: '/suck', method: 'GET' }); // 把数组每个元素转成隐藏输入框 arr.forEach(item => { form.append($('<input>', { type: 'hidden', name: 'arr[]', value: item })); }); // 提交表单 form.appendTo('body').submit(); }); });
控制器代码
public function getAjax(Request $req) { $input = $req->all(); // 直接返回视图,把数组传递给视图使用 return view('A', ['data' => $input['arr']]); }
这样提交后,浏览器会直接跳转到A.blade.php页面,你在视图里可以直接用{{ $data }}来访问数组内容。
方案2:用AJAX把数据存到Session,再跳转
如果一定要保留AJAX的交互逻辑,那可以先把数组暂存到Session里,再让前端跳转,最后在目标页面的控制器中取出Session数据:
前端AJAX修改
$(function(){ $('#but').click(function() { let arr = [1, 2, 3]; // 你的数组 $.ajax({ type: 'POST', url: '/save-arr', data: { arr: arr, _token: '{{ csrf_token() }}' // 别忘了Laravel的CSRF令牌 }, success: function() { // 跳转到展示视图的路由 window.location.href = '/show-A'; }, error: function(xhr, status, error) { alert(error); } }); }); });
新增路由(routes/web.php)
// 存储数组到Session的路由 Route::post('/save-arr',[ajaxcontroller::class,'saveArrToSession']); // 展示视图的路由 Route::get('/show-A',[ajaxcontroller::class,'showAView']);
控制器新增方法
public function saveArrToSession(Request $req) { // 把数组存入Session session()->put('target_arr', $req->arr); return response()->json(['status' => 'ok']); } public function showAView() { // 从Session取出数组 $arr = session()->get('target_arr'); // 用完可以清除Session里的缓存,避免重复使用 session()->forget('target_arr'); // 返回视图并传递数组 return view('A', ['data' => $arr]); }
方案3:把数组转成查询参数,跳转时携带
如果你的数组是简单的一维数组,可以直接把它转成URL查询参数,拼在跳转链接后面:
前端代码(无需AJAX更简洁)
$(function(){ $('#but').click(function() { let arr = [1, 2, 3]; // 把数组转成URL查询字符串 let queryStr = $.param({arr: arr}); // 跳转到目标路由并携带参数 window.location.href = '/show-A?' + queryStr; }); });
控制器代码
public function showAView(Request $req) { // 直接从请求中获取数组参数 $arr = $req->input('arr'); return view('A', ['data' => $arr]); }
为什么你之前的方式不行?
AJAX是浏览器在后台发起的异步请求,控制器返回的视图HTML会作为data参数传给success回调,但浏览器不会自动加载这个页面;而window.location是发起一个全新的GET请求,和之前的AJAX请求完全独立,所以自然没法携带之前的数组数据。
内容的提问来源于stack exchange,提问作者Muteeb Zafar
相关产品推荐
相关产品推荐

