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
相关产品推荐
相关产品推荐

