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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:28:11