【问题标题】:How to show the select values after form is submited and there are errors?表单提交后如何显示选择值并且有错误?
【发布时间】:2018-02-17 16:22:35
【问题描述】:

当用户提交表单时,如果有任何错误,应使用提交的值填充字段,这样用户就不需要再次插入这些值。这工作正常,但选择字段不起作用。

我有以下代码:

<form method="post" class="clearfix" action="{{route('post.store')}}" enctype="multipart/form-data">

<div class="form-row">
    <div class="form-group">
        <label for="event_categories">Categories</span></label>
        <select required  multiple class="form-control"  name="categories[]" id="categories">

            @foreach($categories as $category)
                <option value="{{$category->id}}">{{$category->name}}</option>
            @endforeach

        </select>
    </div>
</div>
<form>

你知道为什么表单提交后出现错误,选择的类别没有出现吗?

【问题讨论】:

    标签: jquery laravel


    【解决方案1】:

    您必须指定&lt;option&gt; 在您加载页面时最初应该被选中,方法是给它适当的属性:

    <option selected>...</option>
    

    在您提供的代码中,selected 属性永远不会应用于您的任何&lt;option&gt;s,因此在您加载页面时浏览器永远不会将它们设置为selected

    当您被重定向回表单时,浏览器不知道上一个请求(提交表单时发出的 POST 请求)提交了哪些数据,因此它无法自动将任何选项设置为@987654328 @,除非在应用程序返回的 HTML 响应中明确告知。

    当验证失败时,Laravel 会自动将提交的表单数据刷新到会话中,因此您可以在以下请求中检索它并使用此信息来呈现表单,从而向浏览器指示之前的 &lt;option&gt;s selected(如果有的话)。

    你可以使用 Laravel 的 old() 助手访问上一个请求提交的数据。

    要获取为字段提交的值,请将字段的name 传递给帮助程序:

    <input name="something" value="{{ old('something', 'optional fallback value') }}">
    

    由于 PHP 将字段的值解释为一个数组,old('categories') 将返回一个值数组或null

    现在对于每个选项,检查循环中当前选项的值是否出现在旧值数组中,如果出现则应用 selected 属性:

    @foreach ($categories as $category)
        <option {{ in_array($category->id, old('categories', [])) ? 'selected' : '' }} value="{{ $category->id }}">
            {{ $category->name }}
        </option>
    @endforeach
    

    在调用 old() 帮助器时包含第二个参数很重要,它将一个空数组 ([]) 设置为备用值。这可以防止它在上一个请求的数据中找不到指定的键时返回null,这将导致in_array() 抛出错误。


    另外,标签中有一个错误的结束 &lt;/span&gt; 标记:

    <label for="event_categories">Categories</span></label>
                                            ^^^^^^^
    

    【讨论】:

      【解决方案2】:

      您需要在选项上设置selected 属性:

      <option value="{{$category->id}}" {{ in_array($category->id, old('categories')) ? 'selected' : '' }}>{{$category->name}}</option>
      

      【讨论】:

      • 谢谢,但似乎 in_array() 期望参数 2 是数组。
      【解决方案3】:

      您可以为此使用 laravel 文档 https://laravel.com/docs/5.6/requests#old-input

      检索旧输入

      要从上一个请求中检索闪烁的输入,请在 Request 实例上使用旧方法。旧方法会从会话中拉取之前刷过的输入数据:

      username = $request->old('username');
      

      Laravel 还提供了一个全局的 old 助手。如果您在 Blade 模板中显示旧输入,则使用旧助手会更方便。如果给定字段不存在旧输入,则将返回 null:

      <input type="text" name="username" value="{{ old('username') }}">
      

      【讨论】:

        【解决方案4】:

        如果你在选择中使用@old 作为第一个选项呢?在@foreach 循环之前

        【讨论】:

        • 它也不适用于:
        猜你喜欢
        • 2019-06-06
        • 1970-01-01
        • 2022-11-06
        • 1970-01-01
        • 2022-11-18
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多