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

Laravel Blade中依赖下拉框无法获取old()值如何解决?

解决Laravel动态加载下拉框验证失败后保留选中值的问题

问题核心:表单验证失败返回页面时,分类下拉框通过AJAX异步加载,AJAX请求是独立HTTP请求,无法获取原表单提交请求的old()闪存数据,同时初始化请求未传递旧分类ID,导致无法选中之前的值。以下是具体修改步骤:


1. 修改页面初始化的AJAX请求,传递旧分类ID

更新jQuery代码,在请求数据中加入旧分类ID,同时补充板块下拉框的切换监听(优化体验):

$(document).ready(function (){
    let sectionid = $('.sectionchoose').val();
    // 获取旧分类ID(优先取表单提交的旧值,编辑页可替换为数据库值)
    let oldCategoryId = '{{ old('category_id') }}';
    
    // 初始化加载分类
    loadCategories(sectionid, oldCategoryId);

    // 监听板块下拉框切换事件
    $('.sectionchoose').on('change', function() {
        let newSectionId = $(this).val();
        // 切换板块时传递当前选中的分类ID
        loadCategories(newSectionId, $('#category_id').val());
    });

    // 封装AJAX加载函数
    function loadCategories(sectionId, oldCatId) {
        $.ajax({
            headers: {
                'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content')
            },
            type: 'POST',
            datatype: 'json',
            url : '/admin/selectsection',
            data: {
                id: sectionId,
                old_category_id: oldCatId
            },
            success: function(response){
                $('.categorylist').html(response)
            },
            error:function(){
                // 可选:添加错误提示逻辑
            }
        })
    }
})

2. 修改分类列表控制器,接收并传递旧分类ID

更新findCategories方法,接收前端传递的旧分类ID,再传递给视图:

public function findCategories(Request $request){
    if($request->json()){
        $data = $request->all();
        $categories = Category::where(['section_id' => $data['id'], 'status'=>1])->get()->toArray();
        // 获取传递的旧分类ID,默认空值
        $oldCategoryId = $data['old_category_id'] ?? '';
        // 把分类数据和旧ID一起传递给视图
        return view('admin.deal-management.categorylist',compact('categories', 'oldCategoryId'));
    }
}

3. 修改categorylist视图,用传递的旧ID判断选中状态

替换原视图中的old('category_id')为控制器传递的$oldCategoryId:

<select class="form-control " name="category_id" id="category_id">
    <option value="">Choose Category</option>
    @foreach($categories as $category)
        <option value="{{$category['id']}}" @if($oldCategoryId == $category['id']) selected @endif>
            {{$category['category_name']}}
        </option>
    @endforeach
</select>

补充说明

  • 若为编辑页面($id不为空),可在主控制器中把数据库里的分类ID传递到视图,JS中替换为{{ $deal->category_id ?? old('category_id') }},兼容编辑和新增场景。
  • old()函数依赖当前请求的session闪存,AJAX请求是独立请求,无法共享原表单请求的闪存数据,因此必须手动传递旧值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:46:17