【问题标题】:Multiple values selection in <g:select> error<g:select> 错误中的多个值选择
【发布时间】:2016-05-06 15:15:25
【问题描述】:

我正在尝试使用&lt;g:select multiple='true'&gt; 对选择使用多个值,但是当我尝试将表单保存到数据库时,我收到了这个错误

Property [Languages] of class [class com.Myapp.hr.EmploymentSeeker] with value [french,english] is not contained within the list [[french, english, russian, chinese]]

这是我的域名:

class EmploymentSeeker {
 Set<String> languages = [] as Set
 static hasMany = [ languages: String ]
 static constraints = {
languages(nullable:true,inList:Holders.config.languages)
 }

}

配置文件:

languages=[
'french',
'english',
'russian',
'chinese'
]

普惠制:

<g:select  multiple="true" name="languages" from="${employmentSeekerInstance.constraints.languages.inList}" value="${employmentSeekerInstance?.languages}" valueMessagePrefix="empSeeker.languages" noSelection="['': '']"/>

什么可能导致这个错误?

【问题讨论】:

    标签: grails


    【解决方案1】:

    如 Grails 文档中所述:

    inList:约束一个值,使其必须包含在给定的列表中。

    问题在于您的 inList 约束它是一个字符串列表,但来自 EmploymentSeekerlanguages 不是 String,它是一个 Set

    如果它是一个字符串,它会起作用,例如:
    'french' 包含在['french','english','russian','chinese']
    但是你有一个Set,所以
    ['french']不包含在['french','english','russian','chinese']

    要使其与 inList 一起使用,您必须在约束列表中设置用户可以选择的所有组合,例如:
    [['french'], ['french', 'english'], ['english', 'french'] ...] 等等。
    This answer 描述了如何归档这些组合,但实际上这不是一个好的解决方案,因为subsequences() 不关心排列。但是,在语言列表增长后,添加排列将成倍增加您的约束列表。

    如您所见,在您的情况下,使用 inList 并不是一个好的解决方案。

    我会建议实现您的自定义简单约束,如下所示:

    languages(nullable:true,validator: {value, object ->
                    Holders.config.languages.containsAll(value)​​​)​
            })
    

    您可以阅读自定义约束 herehere

    【讨论】:

    • &lt;g:select multiple="true" name="languages" from="${employmentSeekerInstance.constraints.languages.inList}" value="${employmentSeekerInstance?.languages}" valueMessagePrefix="empSeeker.languages" noSelection="['': '']"/&gt; 中的 from 怎么样
    • @Sherif,您可以使用您的原始语言列表:from="${Holders.config.languages}"
    • 谢谢,关于多个选择值的域设计,我做对了还是有另一种方便的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2021-12-01
    • 2019-10-20
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多