这里有很多关于表单提交后如何正确保存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()
根本不适用于这种特殊情况。
这不是一个新问题,其他人如何处理?
我也遇到过类似的情况,我的解决方案是在复选框字段之前添加一个隐藏字段。所以,在你的情况下,它会是这样的:
<input type='hidden' name='unicorns' value='0'>
<input type='checkbox' name='unicorns' value='1' {!! old('unicorns', $model->unicorns) ? ' checked' : '' !!}>
这样,当复选框未勾选时,该字段的值0仍将出现在post请求中。勾选后,复选框的值将覆盖隐藏字段中的值,因此顺序很重要。这种方法不需要使用自定义类。
这对你有用吗?
我遇到了同样的问题,找到了这篇旧文章。我想分享我的解决方案:
<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的值或无值。
这是一个类型杂耍,你有嵌套的三元,但它工作得很好。
这就是我在问题中提到的解决办法。它工作得很好,6个月后,它看起来不像我发布这个问题时那么笨拙。不过,我很乐意听到其他人是如何做到这一点的。
我有一个Html
helper,如本问题所述创建,并在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相同值有多个在