Grails选择标记结果

Grails选择标记结果,grails,data-binding,Grails,Data Binding,我试图通过一个使用数据绑定的表单来更新一个hasMany关系,但是我在params中得到的数据似乎不正确 域类: class CustomerSite { static hasMany = [dhrs:DeviceHistoryRecord]; static mapping = { id generator:'sequence', params:[sequence:'cs_seq'] } ... } 编辑视图: ... <g:select name="dhrs" id

我试图通过一个使用数据绑定的表单来更新一个
hasMany
关系,但是我在
params
中得到的数据似乎不正确

域类:

class CustomerSite {

static hasMany = [dhrs:DeviceHistoryRecord];

static mapping = {
    id generator:'sequence', params:[sequence:'cs_seq']
}
    ...
}
编辑视图:

...
<g:select name="dhrs" id="dhrs" 
from="${DeviceHistoryRecord.list()}"
multiple="multiple"
optionKey="id"
value="${customerSiteInstance?.dhrs}"/>
这给了我一个错误:

错误200:org.springframework.beans.NotReadablePropertyException:bean类[java.lang.String]的属性“currentDeviceData”无效:bean属性“currentDeviceData”不可读或具有无效的getter方法:getter的返回类型是否与setter的参数类型匹配

在控制器代码的这一行:

if(!customerSiteInstance.hasErrors() && customerSiteInstance.save()) {
这对我来说没有任何意义,但我做了一些愚弄(事实上,很多),最终发现
g:select
将索引集合传递给params

视图输出我认为正确的代码:

<select name="dhrs" id="dhrs" multiple="multiple" >
  <option value="2421" >801122</option>
  <option value="2422" >801123</option>
  ...

801122
801123
...
如果我选择列表中索引0和索引1处的项目,它不会像我预期的那样传入一组“2421”和“2422”。它正在传入“0”和“1”。更糟糕的是,在我运行之后,当我返回到编辑页面并再次运行它时,这次在索引8中选择一些内容,它将有“8”…还有上次的“0”和“1”

环顾一下这里,我发现,它还有一些其他的想法,包括做出这样的改变:

<g:select name="dhrs.id" 
  from="${DeviceHistoryRecord.list()}" 
  multiple="multiple" 
  optionKey="id" 
  value="${customerSiteInstance?.dhrs*.id}"/>

但这给了我一个缺少方法的错误,尽管它确实解决了返回索引而不是实际值的问题

你知道这是怎么回事吗?我该怎么解决

顺便说一句,我正在运行Grails的1.0.4版。是的,我很想升级,但我不能

谢谢

在g:选择使用:

value="${customerSiteInstance?.dhrs?.id}"

问号代替星号。这就是我的“多重选择”的方式。

我在这方面花了更多的时间,得到了部分解决方案。 以下是我最终得到的结果:

<g:select name="dhrsX.id" 
          from="${DeviceHistoryRecord.list()}"
          multiple="multiple"
          optionKey="id"
          value="${customerSiteInstance?.dhrs*.id}"/>

现在单选和多选都可以工作了…但还有一个小问题有待解决。尽管在添加新选择之前在
dhrs
上调用
clear()
,但先前的选择仍然保留。然而,我不认为这会像修复一样复杂

当我看到你的帖子时,我已经找到了我发布的解决方案。在我的例子中,如果我使用
*
似乎没有什么区别,尽管我看到它们有不同的用途。所以,任何一个都有效。谢谢你的最终解决方案看起来太复杂了,我相信不应该是这样,问题隐藏在其他地方。
<g:select name="dhrsX.id" 
          from="${DeviceHistoryRecord.list()}"
          multiple="multiple"
          optionKey="id"
          value="${customerSiteInstance?.dhrs*.id}"/>
def update = {
    def customerSiteInstance = CustomerSite.get( params.id )
    if(customerSiteInstance) {

        customerSiteInstance.properties = params
        customerSiteInstance.dhrs.clear()

        for(thisDHR in params.dhrsX) {
            def value = thisDHR.getValue()
            def ArrayList<String> list = new ArrayList<String>();
            if (value instanceof String) {
                list.add(value)
            } else {
                for(oneValue in value) {
                    list.add(oneValue)
                }
            }

            for(aDHR in list){
                DeviceHistoryRecord rec = DeviceHistoryRecord.get(aDHR)
                if (rec != null) {
                    customerSiteInstance.addToDhrs(rec)
                } else {
                    print(thisDHR + " NOT FOUND!")
                }
            }
        }
...