
在 Laravel 表单验证失败后重定向时,普通输入框可通过 old('field') 自动回填,但 下拉框需为每个 手动添加 selected 属性才能保留用户选择;直接在 标签上写 value="{{ old('country') }}" 无效。
在 laravel 表单验证失败后重定向时,普通输入框可通过 `old('field')` 自动回填,但 `
Laravel 的 old() 辅助函数仅对 、
以下是修正后的下拉框代码示例(兼容 Blade 模板):
<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">
@foreach($countries as $code => $name)
<option value="{{ $code }}"
{{ old('country') == $code ? 'selected' : '' }}>
{{ $name }}
</option>
@endforeach
</select>
</div>⚠️ 关键注意事项:
- ✅ 不要在
- ✅ old('country') 返回的是提交时 name="country" 字段的实际值(如 'US' 或 'CN'),因此 @foreach 中的 $code 必须与该值严格匹配(类型与内容均一致);
- ✅ 若使用 @include('layouts.country-list') 引入国家列表,请确保该子视图中每个
- ✅ 对于空选项(如 “请选择”),建议设 value="" 并添加判断:,以兼容未选择场景。
进阶提示:若国家数据来自数据库或配置文件,推荐在 Controller 中预加载并传递:
// In your controller method
$countries = collect(config('countries'))->mapWithKeys(fn($name, $code) => [$code => $name]);
return view('your-form', compact('countries'));总结:下拉框保留旧值的本质是「服务端驱动的 DOM 状态同步」——Blade 在渲染时逐项比对并标记 selected,而非依赖客户端行为。掌握这一模式后,所有 select、radio、checkbox 等控件的旧值恢复均可类推实现,确保表单体验专业、健壮且符合 Laravel 最佳实践。

















