在g.select中填充列表
我需要以编程方式加载列表。 而不是:在g.select中填充列表,select,grails,Select,Grails,我需要以编程方式加载列表。 而不是: <g:select name="cars" from="${Car.list()}" value="${person?.cars*.id}" optionKey="id" multiple="true" /> “发件人”未加载。通过列表,我收到一条错误消息: 没有方法的签名:sample.SearchTagLib.$()适用于参数类型:(sample.SearchTa
<g:select
name="cars"
from="${Car.list()}"
value="${person?.cars*.id}"
optionKey="id"
multiple="true" />
“发件人”未加载。通过列表,我收到一条错误消息:
没有方法的签名:sample.SearchTagLib.$()适用于参数类型:(sample.SearchTagLib$\u getSelectField\u closure5)值:[sample.SearchTagLib$\u getSelectField]_closure5@1187b50]可能的解决方案:is(java.lang.Object)、any()、use([Ljava.lang.Object;)、any(groovy.lang.Closure)、wait()、grep()我认为您需要使用字符串作为属性名:
g.select('name' : searchfield.fieldName,
'class' : "fillWidth searchfield",
'multiple' : "true",
'from' : ${ searchfield.fieldFrom },
'optionKey' : searchfield.fieldKey,
'optionValue' : searchfield.fieldValue)
在
from
选项中不需要${}
g.select(name : searchfield.fieldName,
class : "fillWidth searchfield",
multiple : "true",
from : searchfield.fieldFrom,
optionKey : searchfield.fieldKey,
optionValue : searchfield.fieldValue)
在Groovy代码中,${}
是一种将Groovy表达式放在双引号GString中的方法,如果您不在GString中,您可以直接使用表达式,而无需将其包装在${}
中
编辑您的评论中的
此时的fieldFrom是一个字符串,可以从数据库中获取其值。因此,DB中的值是“Car.list()”,在原型中,我需要将其转换为可绑定或可执行的代码行 通常不建议允许您的应用程序执行用户提供的任意Groovy代码片段(出于明显的安全原因)。只要代码片段来自一个安全的来源,如可信的管理员用户,那么使用
GroovyShell
def from = new GroovyShell().evaluate(searchfield.fieldFrom)
但是这可能会非常低效,每次创建一个新的类加载器并解析和编译整个Groovy脚本类或车辆。查找大于(2)
,而不是像[1,2,3]
那样的任意Groovy的HQL表达式,那么最好将HQL表达式存储在字段中,并使用executeQuery运行它们
def from = AnyDomainClass.executeQuery(searchfield.fieldFrom)
(executeQuery
是一个静态GORM方法,您需要在特定的域类上调用它,但它可以返回任何类型的结果。)Car.list()
的HQL等价物将是“from Car
”,等价物将是Vehicle.findallbynumberofheelsgener(2)
“来自车辆,其中numberOfWheels>2
”,等等。这样做不会产生错误,它会像字符串一样解析值,但如果searchfield.fieldFrom=Car.list()我想让它得到可用汽车的清单。这将是一张桌子上的汽车user@user2498465这正是它应该做的。什么是searchField
以及如何设置它?此时的fieldFrom是一个字符串,可以从数据库中获取其值。因此数据库中的值是“Car.list()“在原型中,我需要将其转换为可绑定或可执行的代码行。@user2498465我明白了,我添加了一些可能的建议。感谢GroovyShell的工作,该列表来自一个安全的源代码。谢谢。”
def from = AnyDomainClass.executeQuery(searchfield.fieldFrom)