Laravel如何在表单验证报错后保留复选框的选中状态?
问题根因
- 你当前代码的判断逻辑和实际提交的value不匹配:复选框定义的
value是字符串delete-user,但你判断时是查找old('permissions')中是否存在数字1,永远匹配不到,自然不会触发checked状态。 - 用
old('permissions.'.$key)的写法不符合表单提交逻辑:只有选中的复选框才会被提交到permissions[]数组中,提交后的数组索引是连续生成的,和页面上原有复选框的索引没有对应关系,因此无法通过固定索引拿到对应值。
正确实现方案
直接判断当前复选框的value是否存在于old('permissions')数组中即可,同时兼容old值不存在的场景:
<input type="checkbox" id="delete-user" class="form-check-input" data-data-section="users" name="permissions[]" value="delete-user" {{ (is_array(old('permissions')) && in_array('delete-user', old('permissions'))) ? ' checked' : '' }} >
如果是循环渲染多个权限复选框的场景,假设循环变量为$perm,权限值字段为value,可以统一封装逻辑:
@foreach($permissions as $perm) <input type="checkbox" id="perm-{{ $perm->id }}" class="form-check-input" data-data-section="users" name="permissions[]" value="{{ $perm->value }}" {{ (is_array(old('permissions')) && in_array($perm->value, old('permissions'))) ? ' checked' : '' }} > <label class="form-check-label" for="perm-{{ $perm->id }}">{{ $perm->name }}</label> @endforeach
如果需要兼顾首次加载时回填数据库中已保存的权限,假设已选权限存储在$userPermissions数组中,可以扩展判断逻辑:
{{ (is_array(old('permissions')) && in_array($perm->value, old('permissions'))) || in_array($perm->value, $userPermissions) ? ' checked' : '' }}
内容的提问来源于stack exchange,提问作者Duddy67
相关产品推荐
相关产品推荐

