【问题标题】:Grails select tag resultsGrails 选择标记结果
【发布时间】:2012-07-17 13:48:01
【问题描述】:

我正在尝试使用数据绑定通过表单更新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}"/>

控制器:

def update = {
    def customerSiteInstance = CustomerSite.get( params.id )
    if(customerSiteInstance) {

        customerSiteInstance.properties = params

        String flashMsg = new String();

        flash.message = "";

        if(!customerSiteInstance.hasErrors() && customerSiteInstance.save()) {
            flash.message += "Customer Site ${customerSiteInstance.toString()} updated"
            redirect(action:show,id:customerSiteInstance.id)
        }
        else {
            flash.message = flashMsg
            render(view:'edit',model:[customerSiteInstance:customerSiteInstance])
        }
    }
    else {
        flash.message = "Customer Site not found with id ${params.id}"
        redirect(action:edit,id:params.id)
    }
}

这给了我一个错误:

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

在控制器代码的这一行:

if(!customerSiteInstance.hasErrors() && customerSiteInstance.save()) {

这对我来说没有任何意义,但我做了一些愚弄(实际上很多),最终发现g:select 正在将一组索引传递给参数。

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

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

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

在这里看了一圈,发现Selecting multiple values from select tag - Grails,还有一些其他的想法,包括做出这样的改变:

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

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

关于这里发生了什么以及如何解决它的任何想法?

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

谢谢!

【问题讨论】:

    标签: grails data-binding


    【解决方案1】:

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

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

    注意这是dhrsX - 不是dhrs。这样,我可以在将它们设置到 CustomerSite 对象之前手动查找每一个。唯一复杂的是,如果用户选择了一项,dhrsX 包含一个String;如果用户选择多个项目,dhrsX 包含Strings 的列表。为了解决这个问题,我需要重新打包选择结果,然后再尝试直接使用它们。

    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!")
                    }
                }
            }
    ...
    

    现在单选和多选都可以工作了……但是还有一个小问题。尽管在添加新选择之前在dhrs 上调用clear(),但之前的选择仍然存在。但是,我不希望这几乎像修复一样复杂。

    【讨论】:

      【解决方案2】:

      在 g:select 中使用:

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

      问号而不是星号。这就是我的“多选”方式。

      【讨论】:

      • 当我看到你的帖子时,我已经走上了我发布的解决方案的道路。就我而言,如果我使用?* 似乎并没有什么不同,尽管我发现它们有不同的用途。所以,任何一个都有效。谢谢!
      • 你的最终解决方案看起来太复杂了,不应该是这样,我相信问题隐藏在其他地方。
      猜你喜欢
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      相关资源
      最近更新 更多