gsp中的grails动态选择
它不是那么动态,但会根据域中的一组字段更改其内容 我有4个字段中的4个价格,然后我有一个字段,该字段的点是要使用的价格 我创建了一个要选择的价格列表,其中一些价格可以为空,不应显示在列表中 我在创建列表的域中使用了beforeInsert。 但我只得到一个字符串,每个元素之间用“;”分隔因此,在select中,将只包含一个包含所有元素的字符串 它必须是我生成的列表类型的东西,所以我需要帮助知道如何正确创建此列表 域:gsp中的grails动态选择,grails,gsp,Grails,Gsp,它不是那么动态,但会根据域中的一组字段更改其内容 我有4个字段中的4个价格,然后我有一个字段,该字段的点是要使用的价格 我创建了一个要选择的价格列表,其中一些价格可以为空,不应显示在列表中 我在创建列表的域中使用了beforeInsert。 但我只得到一个字符串,每个元素之间用“;”分隔因此,在select中,将只包含一个包含所有元素的字符串 它必须是我生成的列表类型的东西,所以我需要帮助知道如何正确创建此列表 域: class Author { def String name
class Author {
def String name
def String email
def BigDecimal price1
def BigDecimal price2
def BigDecimal price3
def BigDecimal price4
def String choosedCert
def List<String> availableCert
static transients = ['availableCert']
static constraints = {
name nullable:true
email nullable:true
price1 nullable:true
price2 nullable:true
price3 nullable:true
price4 nullable:true
}
def beforeInsert() {
availableCert = getAvailableCert()
}
def List<String> getAvailableCert() {
def List<String> sl = new ArrayList<String>()
if (price1 != null) sl.add('FSC')
if (price2 != null) sl.add('PEFC')
if (price3 != null) sl.add('CW')
if (price4 != null) sl.add('UC')
return sl
}
}
以及普惠制中的规定:
<g:select name="choosedCert" from="${author.availableCert}
"value="${choosedCert}" />
//-----
更正我的打字错误后:
<g:select name="choosedCert" from="${author?.availableCert}" value='' />
但我还是有问题:
当我选择“FSC”时,我会将ChooseSecrt中的值作为“FSC”,如果我选择一个新值,例如“UC”,我会将该值作为UC,FSC。
这是一个edit.gsp,因此每次更新后,我都会将所选值添加到现有值中,因此在再次更新并选择“PEFC”后,我会得到“PEFC,UC,FSC”,因此首先插入新值,然后再添加旧值。因为在编辑脚手架视图时,最终会得到两个名为ChooseCert的元素,理想情况下,您需要创建自己的edit.gsp并只渲染所需的元素,但作为一个示例,我执行了以下操作 在BootStrap中添加了作者,如下所示:
def init = { servletContext ->
new Author( name: 'Dave', email: 'myemail', price1: new BigDecimal(1), price2: new BigDecimal(2), choosedCert: 'FSC' ).save( failOnError: true )
}
然后在AuthorController中编辑更新操作:
...
author.choosedCert = params.availableCert
author.save flush:true
...
然后在edit.gsp中:
...
</fieldset>
<g:select name="availableCert" from="${author.availableCert}" value="${author.choosedCert}" />
<fieldset class="buttons">
...
显然,这并不理想,因为您仍然有由Grails呈现的choosedCert文本元素,并且没有对下拉表单元素应用样式,但是如果更改下拉列表并更新,正确的值将保存在域对象的choosedCert中。
脚手架非常有助于使事情顺利进行,但确实存在局限性,最终您将编写自己的gsp,并使用服务进行交易腿工作。我准备了一份简单的gsp和您的设置: 域类为:
class Author {
String name
String email
BigDecimal price1
BigDecimal price2
BigDecimal price3
BigDecimal price4
String choosedCert
List<String> availableCert
static transients = ['availableCert']
static constraints = {
name nullable:true
email nullable:true
price1 nullable:true
price2 nullable:true
price3 nullable:true
price4 nullable:true
choosedCert nullable: true
}
def beforeInsert() {
availableCert = getAvailableCert()
}
def List<String> getAvailableCert() {
def List<String> sl = new ArrayList<String>()
if (price1 != null) sl.push('FSC')
if (price2 != null) sl.push('PEFC')
if (price3 != null) sl.push('CW')
if (price4 != null) sl.push('UC')
println sl
return sl
}
}
和index.gsp作为:
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main"/>
<title>Form</title>
</head>
<body>
<g:form controller="author" action="update">
<g:select name="choosedCert" from="${author?.availableCert}" value='' />
<g:actionSubmit value="Update" />
</g:form>
</body>
</html>
然后,当我检查输出中的参数值时:
[选择证书:FSC,\操作\更新:更新,控制器:作者,操作:更新]
这里提到的FSC只是将ChooseSecrt值与_action _Update分开看起来您可能做得不对,您试图解决的基本问题是什么?为什么不使用单个映射属性,而不是将价格硬编码为字符串?我只想在GSP中获得一个SELECT,它只列出与正确价格对应的字符串。即,如果price1、price2和price4包含价格,则选择应包含字符串“FSC”、“PEFC”和“UC”。当选择一个字符串时,应该在“ChooseSecrt”中设置该字符串。就这些。是的,正如你说的,那是打字错误。我用了一个小测试项目,在那里我测试了不同的东西,所以我只是复制了重要的部分,但丢失了那些括号。但是当你设法使它工作时,我又看了一眼,发现了另一个打字错误。在gsp行中,我发现value=之前的doublequote要关闭,没有空格。所以我在中间加了一个空格来修复它。对不起,我遇到了更多的问题。这是一个edit.gsp,因此在选择一个值后,我单击“更新”并插入该值。问题是,首先,该值在其后面像“FSC”一样用“,”保存,如果我用例如选择的“UC”进行新的更新,它将作为“UC,FSC”添加到旧的更新之前。最左边的将没有“,”。提交后如何检索choosedCert并绑定到域?我所做的只是您在代码中看到的。在上面一切都在普惠制范围内。我以前在域中使用inlist来实现所有操作,但现在当我需要动态列表时,使用inlist是不可能的。我之前对最左边的值的评论是错误的-它确实以“,”结尾,但它不可见。所以你使用的是脚手架控制器?我不明白你的意思,你的代码是否有效。。?我看不出我的代码有什么显著的区别,我错过了什么吗?我提到了我点击更新按钮后得到的输出,即我得到的参数值。所以,您可以参考这一点并尝试您的代码,而且您的代码对我来说似乎是正确的,只是您正在以不同的方式读取控制器端接收到的值。我ping的内容在grails 3.2.4中进行了测试。嗯,这是一个倒退,现在所有元素都列在SELECT中的一行上。我在控制器中创建了一个名为index2的新gsp和一个相应的操作。我在控制器中更改了旧更新的名称,然后复制了您的代码。也许我可以把整个项目都压缩好让你检查一下?我看不出有什么区别,但肯定有点问题。
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main"/>
<title>Form</title>
</head>
<body>
<g:form controller="author" action="update">
<g:select name="choosedCert" from="${author?.availableCert}" value='' />
<g:actionSubmit value="Update" />
</g:form>
</body>
</html>