当前位置: 首页 > 知识库问答 >
问题:

验证失败后的Laravel复选框状态

韩寂离
2023-03-14

这里有很多关于表单提交后如何正确保存Laravel中的复选框字段的问题(例如,示例,示例),这个问题与此无关。

请注意,我也很清楚Laravel的old()方法,并且它接受默认值。我的问题是关于old()似乎对复选框不起作用的特定情况。

我正在编辑表单,更新数据库中已有的数据。表单最初将填充DB中的值。

验证失败后重新填充表单输入的标准方法是使用old()。对于大多数输入类型,类似于以下内容的操作都有效:

<input type='text' name='unicorns' value='{{ old('unicorns', $model->unicorns) }}'>

在初始页面加载时(在提交表单之前),这可以正常工作。由于尚未提交任何内容,old('unicorns')null,因此$model的默认值为-

提交一个新值(验证失败)后,old('unicorns')将成为新值,即使新值是一个空字符串,文本字段的值也会反映提交状态,正如我们所希望的那样。

但是,当未选中的复选框根本不出现在请求中时,复选框会出现故障。考虑:

<input type='checkbox' name='unicorns' value='1' @if old('unicorns', $model->unicorns) checked @endif>

在初始页面加载时,这很好,就像文本字段一样。但验证失败后,对于复选框从初始状态更改的2种情况:

>

  • 案例1:DB状态0(未选中),提交状态已选中old('unicorns')将是1,因此测试评估true,复选框被选中-确定!

    案例2:DB状态1(选中),提交状态未选中。由于old('unicorns')为空,old()返回到默认值$model-

    (在其他两种情况下没有问题,其中复选框的状态没有从数据库中更改)。

    这个怎么解决?

    我最初认为最好的解决方法是测试是否存在验证错误-如果是,使用old()值,没有默认的回退;如果没有,请使用带有默认回退的old()。测试验证失败的一种方法是检查$errors。这似乎是可行的,但它只在AFAICT视图中有效,如(来自Laravel文档):

    注意:$错误变量绑定到视图...

    我想为此创建一个全局帮助程序$errors在那里不起作用。无论如何,这种方法感觉。。。笨重又太复杂。

    我错过什么了吗?有没有一个简单的解决方法?奇怪的是,old()根本不适用于这种特殊情况。

    这不是一个新问题,其他人如何处理?


  • 共有3个答案

    祖波光
    2023-03-14

    我也遇到过类似的情况,我的解决方案是在复选框字段之前添加一个隐藏字段。所以,在你的情况下,它会是这样的:

    <input type='hidden' name='unicorns' value='0'>
    <input type='checkbox' name='unicorns' value='1' {!! old('unicorns', $model->unicorns) ? ' checked' : '' !!}>
    

    这样,当复选框未勾选时,该字段的值0仍将出现在post请求中。勾选后,复选框的值将覆盖隐藏字段中的值,因此顺序很重要。这种方法不需要使用自定义类。

    这对你有用吗?

    王波
    2023-03-14

    我遇到了同样的问题,找到了这篇旧文章。我想分享我的解决方案:

    <input type="checkbox" name="unicorns" class="form-check-input" id="verified" {{ !old()?$model->unicorns:old('unicorns')?' checked':'' }}>
    
    {{ !old()?$model->unicorns:old('unicorns')?' checked':'' }}
    
    

    嵌套三元数:第一个三元数为第二个三元数提供条件:

    当没有old()数组时,就没有post,因此DB值$model-

    {{$model-

    但是,如果存在old()数组,我们可以使用old('unicorns')变量的存在作为条件,如下所示:

    {{old('unicorns')?'checked':''}}将正确计算on的值或无值。

    这是一个类型杂耍,你有嵌套的三元,但它工作得很好。

    华建同
    2023-03-14

    这就是我在问题中提到的解决办法。它工作得很好,6个月后,它看起来不像我发布这个问题时那么笨拙。不过,我很乐意听到其他人是如何做到这一点的。

    我有一个Htmlhelper,如本问题所述创建,并在config/app中使用别名。php如本问题答案第一部分所述。我在其中添加了一个静态方法:

    namespace App\Helpers;
    use Illuminate\Support\ViewErrorBag;
    
    class Html {
        /**
         * Shortcut for populating checkbox state on forms.
         *
         * If there are failed validation errors, we should use the old() state
         * of the checkbox, ignoring the current DB state of the field; otherwise
         * just use the DB value.
         *
         * @param string $name The input field name
         * @param string $value The current DB value
         * @return string 'checked' or null;
         */
        public static function checked($name, $value) {
            $errors = session('errors');
    
            if (isset($errors) && $errors instanceof ViewErrorBag && $errors->any()) {
                return old($name) ? 'checked' : '';
            }
    
            return ($value) ? 'checked' : '';
        }
    }
    

    现在在我看来,我可以这样使用它:

    <input type='checkbox' name='unicorns' value='1' {{ \Html::checked('unicorns', $model->unicorns) }}>
    

    在初始加载和验证失败后,这将正确处理数据库和提交状态的所有组合。

     类似资料:
    • 问题内容: 我有一个复选框列表,其中至少一个是强制性的。我试图通过AngularJS验证来实现这一点,但是很难。下面是我的代码: 以下是plunker中的代码:http ://plnkr.co/edit/Bz9yhSoPYUNzFDpfASwt?p=preview 有没有人在AngularJS上做到这一点?使复选框成为必需,迫使我选择所有复选框值。AngularJS文档中也未记录此问题。 问题答案

    • 遵循这个指南:https://www.youtube.com/watch?v=bqkt6eSsRZs 添加了从laravel docs的auth路由 创建登录/注册视图 创建 /home路线 自定义AuthController: 尝试访问身份验证/登录时,我遇到以下错误: 请求中出现错误异常。php第775行:。。未根据请求设置会话存储。 已将身份验证路由移动到中间件组。 成功注册,在数据库和会话

    • 我在XAML有一个组合框,写为 并且“”在ViewModel类中实现为 在这里设置之前,它会根据某些条件进行验证。我的目的是在验证失败时将组合框选择更改为先前的值。这不适用于组合框,但是此方法非常适用于CheckBox控件——下面给出的代码片段。 有什么方法可以让这个为ComboBox工作吗?任何替代实现也可以。

    • - 我运行了此脚本,但出现了此错误。我怎么做?

    • 当html页面上没有任何变量可以切换时,是否有人知道如何使用selenium处理或读出复选框的状态(true/false)。我已经尝试了常用函数。isselected()和。isenabled(),但这些函数只读取不可用的值。 有人知道有没有办法得到这个身份吗?此外,xml的屏幕截图以及它是哪个元素。 如果有人有主意就太好了。我在用Java编程。

    • 本文向大家介绍js和jquery分别验证单选框、复选框、下拉框,包括了js和jquery分别验证单选框、复选框、下拉框的使用技巧和注意事项,需要的朋友参考一下 本文分别介绍了js和jQuery验证单选框(radio)、多选框(checkbox)、下拉框(select),分享给大家供大家参考,具体内容如下 (1).首先说单选框(radio),radio和checkbox一样都是name相同值有多个在