
在 Laravel 表单验证失败后重定向时,普通输入框可通过 old() 辅助函数自动保留值,但 下拉框需为每个 显式添加 selected 属性才能恢复选中状态,而非在 标签上设置 value 属性。
在 laravel 表单验证失败后重定向时,普通输入框可通过 `old()` 辅助函数自动保留值,但 `
Laravel 的 old() 函数专为表单重填设计,但它对不同 HTML 元素的使用方式有本质区别:对于 、
因此,修复您代码中的下拉框问题,关键在于:遍历所有 。以下是正确写法:
<div class="form-group">
<label class="block uppercase text-gray-700 text-xs font-bold">{{ __('Country') }}</label>
<select name="country" id="countrylist" class="form-control js-example-basic-single">
@include('layouts.country-list')
</select>
</div>
⚠️ 注意:@include('layouts.country-list') 中的每个
<!-- resources/views/layouts/country-list.blade.php -->
<option value="">{{ __('Select a country') }}</option>
@foreach($countries as $code => $name)
<option value="{{ $code }}" old :>
{{ $name }}
</option>
@endforeach
✅ 正确要点:
- selected 属性必须写在
- 比较逻辑使用 old('country') == $code(注意是双等号,支持类型宽松比较;若严格要求类型一致,可用 ===);
- 若 old('country') 为空或未定义,所有 option 的 selected 条件均为 false,首项(如 placeholder)将自然被选中;
- 不要在
标签上写 value="{{ old('country') }}" —— 这是无效的,应彻底移除。
? 进阶提示:若国家列表来自数据库或配置,建议在控制器中传入 $countries 数组(如 ['US' => 'United States', 'CA' => 'Canada', ...]),避免在视图中硬编码或重复查询。
✅ 最终效果:当用户选择“Canada”(value="CA")并提交导致验证失败时,old('country') 返回 "CA",模板中对应 将自动带上 selected 属性,浏览器在重渲染页面时即高亮该选项,实现无缝重填。
总结:Laravel 表单下拉框的旧值恢复,核心不是“给 select 设 value”,而是“让正确的 option 被标记为 selected”。掌握这一语义差异,即可彻底解决重定向后下拉框重置的问题。










