gsp 中的 grails 动态 select
grails dynamic select in gsp
嗯,它不是那么动态,但会根据域中的一组字段更改其内容。
我在 4 个字段中有 4 个价格,然后我有一个字段指出要使用哪个价格。
我创建了一个要select编辑的价格列表,有些价格可以是空的,不应显示在列表中。
我在创建列表的域中使用了 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='' />
但我仍然遇到问题:
当我 select 'FSC' 时,我在 choosedCert 中得到的值是 'FSC,',如果我将 select 一个新值,例如'UC' 我会得到 UC,FSC 的值。
这是一个 edit.gsp,所以在每次更新后,我都会将 selected 值添加到现有值中,所以在使用 'PEFC' selected 再次更新后,我'我会得到 'PEFC,UC,FSC' 所以先插入新值,然后再添加旧值。
因为您正在编辑脚手架视图,所以您最终会得到 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 呈现的 choosedCert 文本元素,并且没有对下拉表单元素应用任何样式,但是如果您更改下拉列表并更新,正确的值将保存在域对象的 choosedCert。
脚手架非常适合让事情顺利进行,但也有局限性,最终您将最终编写自己的 gsp 并使用服务来完成交易工作。
我用你的设置准备了一个简单的 gsp:
域 class 为:
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>
然后当我检查输出中的参数值时:
[choosedCert:FSC, _action_Update:Update, controller:author, action:update]
这里FSC
后面提到的,
只是为了把choosedCert
值和_action_Update
分开
嗯,它不是那么动态,但会根据域中的一组字段更改其内容。
我在 4 个字段中有 4 个价格,然后我有一个字段指出要使用哪个价格。
我创建了一个要select编辑的价格列表,有些价格可以是空的,不应显示在列表中。
我在创建列表的域中使用了 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='' />
但我仍然遇到问题:
当我 select 'FSC' 时,我在 choosedCert 中得到的值是 'FSC,',如果我将 select 一个新值,例如'UC' 我会得到 UC,FSC 的值。 这是一个 edit.gsp,所以在每次更新后,我都会将 selected 值添加到现有值中,所以在使用 'PEFC' selected 再次更新后,我'我会得到 'PEFC,UC,FSC' 所以先插入新值,然后再添加旧值。
因为您正在编辑脚手架视图,所以您最终会得到 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 呈现的 choosedCert 文本元素,并且没有对下拉表单元素应用任何样式,但是如果您更改下拉列表并更新,正确的值将保存在域对象的 choosedCert。 脚手架非常适合让事情顺利进行,但也有局限性,最终您将最终编写自己的 gsp 并使用服务来完成交易工作。
我用你的设置准备了一个简单的 gsp:
域 class 为:
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>
然后当我检查输出中的参数值时: [choosedCert:FSC, _action_Update:Update, controller:author, action:update]
这里FSC
后面提到的,
只是为了把choosedCert
值和_action_Update