【问题标题】:grails dynamic select in gspgsp中的grails动态选择
【发布时间】:2017-03-22 16:12:19
【问题描述】:

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

我在 4 个字段中有 4 个价格,然后我有一个字段表示要使用哪个价格。

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

我在创建列表的域中使用了 beforeInsert。 但我只得到一个字符串,每个元素用';'分隔所以在选择中将只包含一个包含所有元素的字符串。

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

域名:

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='' />

但我还是有问题:

当我选择“FSC”时,我会在 selectedCert 中将值设为“FSC”,如果然后我将选择一个新值,例如'UC' 我会得到 UC,FSC 的值。 这是一个edit.gsp,所以每次更新后,我都会将选定的值添加到现有值中,所以在再次更新选择“PEFC”后,我会得到“PEFC,UC,FSC”,所以新值是首先插入,然后添加旧值。

【问题讨论】:

  • 看来您可能搞错了,您要解决的基本问题是什么?为什么不使用单个 Map 属性,而不是将价格硬编码为字符串?
  • 我只想在 GSP 中获得一个 SELECT,它只列出与正确价格对应的字符串。 IE。如果 price1、price2 和 price4 包含价格,则 SELECT 应包含字符串“FSC”、“PEFC”和“UC”。 And when a string is selected, that string should be set in 'choosedCert'.就是这样。

标签: grails gsp


【解决方案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 文本元素,并且没有对下拉表单元素应用任何样式,但是如果您更改下拉列表并更新正确的值将保存在域对象的选择证书。 脚手架非常适合让事情顺利进行,但也有局限性,最终您将编写自己的 gsp 并使用服务进行事务处理。

【讨论】:

  • 是的,正如你所说,那是拼写错误。我使用了一个小测试项目来测试不同的东西,所以我只是复制了基本部分,但丢失了那些括号。但是当你设法让它工作时,我又看了一眼,发现了另一个错字。在 gsp 行中,我发现 "value=" 之前的双引号是关闭的,没有空格。所以我通过在两者之间放置一个空格来修复它。
  • 抱歉,我遇到了更多问题。这是一个edit.gsp,所以在选择一个值后,我单击更新并插入该值。问题是首先,该值以“,”保存在它之后,例如“FSC”,如果我使用例如'UC' 选择它会被添加到旧的前面作为 'UC,FSC'。最左边不会有','。
  • 提交后如何检索选择的证书并绑定到域?
  • 我所做的只是您在我的代码中看到的。多于。一切都在gsp-line中。我曾经在域中使用“inlist”来完成所有工作,但现在当我需要动态列表时,无法使用 inlist。我之前对最左边的值的评论是错误的 - 它确实以“,”结尾,但它不可见。
  • 所以你使用的是脚手架控制器?
【解决方案2】:

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

<!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,_action_Update:更新,控制器:作者,操作:更新]

这里在FSC 之后提到的, 只是为了将choosedCert 值与_action_Update 分开

【讨论】:

  • 我不明白你的意思,你的代码有效还是..?我看不出与我的代码有任何显着差异,我错过了什么吗?
  • 我提到了点击更新按钮后我得到的输出,即我得到的参数值。所以你能参考这个并在你的代码中尝试,而且你的代码对我来说似乎是正确的,只是你正在以不同的方式读取控制器端收到的值。
  • 无论我 ping 什么都在 grails 3.2.4 中测试
  • 嗯,这是倒退了一步,现在所有元素都列在 SELECT 中的一行上。我在控制器中创建了一个名为 index2 的新 gsp 和相应的操作。我更改了控制器中旧更新的名称,然后我只是复制了您的代码。也许我可以压缩整个项目供您检查?我看不出有什么区别,但肯定有什么区别。
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2011-08-12
  • 1970-01-01
  • 2013-05-11
  • 2012-12-07
相关资源
最近更新 更多