gpt4 book ai didi

forms - Grails:未选中时,单选按钮不会填充命令obj

转载 作者:行者123 更新时间:2023-12-02 15:21:05 24 4
gpt4 key购买 nike

提交表单时,如果未为单选框选择一个值,则不会将任何内容发送到命令对象进行验证。我没有textFields或其他输入类型的问题。

class ApplicationCommand implements Validateable {

Map<String,String[]> questions = new LinkedHashMap<String,String[]>();

static constraints = {
questions validator: {val, obj, errors ->
for(String key : val.keySet()) {
errors.rejectValue("questions[${key}]",'required');
}
}
}
}

<g:radioGroup name="cmd.questions[1]" values="['Yes']" labels="['Yes']">
${it.radio}${it.label}&nbsp;
</g:radioGroup>
<g:textField name="cmd.questions[2]" />

在上面的示例中,如果我将两个字段都保留为空并提交,则会得到以下内容
qusetions = [2: String[0]]

我期望看到的是
questions = [1: String[0], 2: String[0]]

由于此问题,由于未填充 questions validator,因此在我的 key=1中无法对其进行验证。这些问题都是动态的,都是从数据库中提取的,因此我无法在验证程序中对 if !questions.contains(1)之类的内容进行硬编码。我必须假设,提交后将填充到 questions中的所有数据是什么。

我发现了2个变通办法,我都不喜欢

1)仅对于单选按钮,添加一个隐藏字段,如果未选择单选,则将强制填充值。可怕的丑陋
<g:hiddenField name="cmd.questions[1]" value="-" />

2)在验证器中,我向数据库查询所有问题,并手动检查 questions映射中是否存在每个问题。我想避免在验证器中进行数据库查询。

因此,尽管我的两种解决方法都可以使用,但我觉得我不必求助于它们。

最佳答案

我不认为这是命令对象或Grails的限制;我认为这是HTML的局限性。我看到同样的问题在PHP中弹出。

根本的问题是您的命令对象不知道有多少个问题,但是负责确保所有问题都在那里。我可以想到几种(其他)方式来解决此限制:

  • 快速简便的方法是将单个带有问题数量的隐藏输入放入表单。也很丑陋,并且容易受到最终用户的更改。
  • 另一个选择是将问题升级到域中,以便提前知道问题数量,并通过字段或方法将其提供给您的命令对象。然后,您的命令对象可以问您一个问题:“应该有多少个?好吧,我从 View 中得到了多少个?”这与您的#2相似,但无需检索整个集合并进行迭代。这也打开了对每个问题进行进一步验证的路径(例如,不允许文本输入仅数字的答案)。

    这确实需要命中数据库,但这是我可以想到的不依赖于 View 输入而验证问题数量的唯一方法。令人高兴的是,您可以将其打得很浅,如果正确执行,则可以很快地命中数据库。
  • 关于forms - Grails:未选中时,单选按钮不会填充命令obj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36162150/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com