Data binding Grails中命令上与枚举的数据绑定

Data binding Grails中命令上与枚举的数据绑定,data-binding,grails,groovy,Data Binding,Grails,Groovy,我有一门课: class User { Set<Foo> foos = [] } 我有一个控制器动作,参数类型为User def someAction = {User user -> // impl omitted } 我在GSP中创建了一个multi-select <g:select name="foos" multiple="true" from="${Foo.values()}"/> 但是当我提交表单时,所选值不会绑定到User

我有一门课:

class User {
    Set<Foo> foos = []
}
我有一个控制器动作,参数类型为
User

def someAction = {User user ->
    // impl omitted   
}
我在GSP中创建了一个multi-select

<g:select name="foos" multiple="true" from="${Foo.values()}"/>

但是当我提交表单时,所选值不会绑定到
User
命令对象的
foos
属性。我做错了什么?

枚举使用

如果要在元素中使用带有“value”字符串属性(相当常见的习惯用法)的枚举,请尝试以下操作:

enum Rating {
    G("G"),PG("PG"),PG13("PG-13"),R("R"),NC17("NC-17"),NR("Not Rated")

    final String value

    Rating(String value) { this.value = value }

    String toString() { value }

    String getKey() { name() } 
}

然后将optionKey=“key”添加到标签中。信贷:格雷格·博林格(Gregg Bolinger)

从本质上讲,这并不是一个真正的答案。但我不能在评论中公布这方面的细节。我刚刚创建了以下内容:

enum State {
  OK,KS,FL,MA
}

class User {
  Set<State> states = []

  static constraints = {
  }
}

<g:form controller="home" action="save">
    <g:select name="states" multiple="true" from="${com.orm.fun.State.values()}"/>
    <g:submitButton name="save" value="Save"/>
</g:form>

// controller action
def save = { User user ->
    // I didn't do anything here except
    // set a breakpoint for debugging
}
枚举状态{
好的,KS,FL,MA
}
类用户{
设置状态=[]
静态约束={
}
}
//控制器动作
def save={User->
//我在这里什么都没做除了
//为调试设置断点
}
这就是我得到的:


因此,除了枚举的名称之外,我不完全确定你的和我的有什么不同。你能看到什么吗?

好奇-如果你将你的用户更改为有一个
Foo
(而不是
Set
),然后选择一个值,它绑定正确吗?@Rob-是的,可以。我认为,如果我在select中的每个选项中添加索引,枚举集就会起作用,但我想不出任何轻松的方法来实现这一点,您的代码的可能副本在Grails 1.2.1上可以很好地工作。我需要将
Set
中的类型从
Set foos
添加到
Set foos
我认为这不会导致don出现问题。在我的情况下,我不想明确指定一个值,我想使用枚举名称作为值。也许将
String添加到String(){name()}
可以解决我的问题您是编写GSP代码来生成multi-select还是构建UI?在我的例子中,我构建了UI和控制器,但是“创建用户”表单没有我编写的枚举的字段。它只有选择和提交按钮。编辑并添加了完整性。
enum State {
  OK,KS,FL,MA
}

class User {
  Set<State> states = []

  static constraints = {
  }
}

<g:form controller="home" action="save">
    <g:select name="states" multiple="true" from="${com.orm.fun.State.values()}"/>
    <g:submitButton name="save" value="Save"/>
</g:form>

// controller action
def save = { User user ->
    // I didn't do anything here except
    // set a breakpoint for debugging
}