graps动态选择gsp

时间:2017-03-22 16:12:19

标签: grails gsp

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

我在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
    }
}

和gsp中的行:

<g:select name="choosedCert" from="${author.availableCert}
 "value="${choosedCert}" />

// ----------

纠正我的拼写错误后:

<g:select name="choosedCert" from="${author?.availableCert}" value='' />

但我仍有问题:

当我选择&#39; FSC&#39;我将choosedCert中的值视为&#39; FSC,&#39;然后我会选择一个新值,例如&#39; UC&#39;我将获得UC,FSC的价值。 这是一个edit.gsp,因此在每次更新后,我都会将所选值一直添加到现有值中,因此在使用&#39; PEFC&#39;我选择了PEFC,UC,FSC&#39;所以首先插入新值,然后在之后添加旧值。

2 个答案:

答案 0 :(得分:1)

因为您正在编辑脚手架视图,所以最终会得到2个名为choosedCert的元素,理想情况下,您需要创建自己的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渲染的selectedCert文本元素,并且没有样式化应用于下拉表单元素但是如果更改下拉列表并更新正确的值将保存在域对象中choosedCert。 脚手架非常适合开展工作,但确实有局限性,最终你最终会编写自己的gsp并使用服务进行交易支持。

答案 1 :(得分:0)

我用你的设置准备了一个简单的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
    }
}

控制器为:

class AuthorController {
    static responseFormats = ['json']

    def index() {
        [author: Author.findByName('Dave')]
    }

    def update() {
        println(params)
    }
}

和index.gsp as:

<!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>

然后当我检查输出中的params值时:     [choosedCert:FSC,_action_Update:Update,controller:author,action:update]

,之后提到的FSC只是为choosedCert

分隔_action_Update