gsp中的grails动态选择

gsp中的grails动态选择,grails,gsp,Grails,Gsp,它不是那么动态,但会根据域中的一组字段更改其内容 我有4个字段中的4个价格,然后我有一个字段,该字段的点是要使用的价格 我创建了一个要选择的价格列表,其中一些价格可以为空,不应显示在列表中 我在创建列表的域中使用了beforeInsert。 但我只得到一个字符串,每个元素之间用“;”分隔因此,在select中,将只包含一个包含所有元素的字符串 它必须是我生成的列表类型的东西,所以我需要帮助知道如何正确创建此列表 域: class Author { def String name

它不是那么动态,但会根据域中的一组字段更改其内容

我有4个字段中的4个价格,然后我有一个字段,该字段的点是要使用的价格

我创建了一个要选择的价格列表,其中一些价格可以为空,不应显示在列表中

我在创建列表的域中使用了beforeInsert。 但我只得到一个字符串,每个元素之间用“;”分隔因此,在select中,将只包含一个包含所有元素的字符串

它必须是我生成的列表类型的东西,所以我需要帮助知道如何正确创建此列表

域:

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>