Grails:复选框未设置为false

时间:2009-02-22 06:41:44

标签: grails spring-mvc

我正在开发一个Grails(1.0.4)应用程序,我想在网格视图中编辑单个页面上的集合集合。我只是依赖于Spring MVC的索引参数处理才能使它工作得很好,除了一件事:

网格中的

布尔值(或者,就此而言,布尔值)可以通过复选框设置,但不能取消设置,即当我选中复选框并更新时,该值设置为true,但之后当我再次编辑时,取消选中复选框并更新,它仍然是真的。

这是复选框的GSP代码:

<g:checkBox name="tage[${indexTag}].zuweisungen[${indexMitarb}].fixiert" value="${z.fixiert}" />

这是生成的HTML:

<input type="hidden" name="tage[0].zuweisungen[0]._fixiert" />
<input type="checkbox" name="tage[0].zuweisungen[0].fixiert" checked="checked" id="tage[0].zuweisungen[0].fixiert"  />

我找到了一个Grails bug来描述这个效果,但它在1.0.2中标记为固定,并且那里描述的问题机制(隐藏字段名称中的下划线放在错误的位置)不是出现在我的案例中。

任何想法可能是什么原因?

5 个答案:

答案 0 :(得分:4)

这是一个名为Julius Huang的人在grails-user邮件列表上提出的解决方案。它是可重用的,但是依赖于JavaScript来填充一个隐藏字段,其中包含一个未经检查的复选框的“错误”响应,而HTML很遗憾不会发送该复选框。

  

我黑客GSP发送“假”时   取消选中该框(true - &gt; false)   自定义TagLib。

     

默认情况下checkBox什么时候发送   取消选中,所以我使用checkBox作为   事件处理程序但发送隐藏字段   代替。

     Controller中的

“params”可以处理   “假” - &gt;没有任何“真实”   修改。例如。一切都还在   在控制器中也是如此。

GSP中的自定义标记用法(示例usedfunc_F为“true”),

<jh:checkBox name="surveyList[${i}].usedfunc_F" value="${survey.usedfunc_F}"></jh:checkBox>

这是标签生成的内容,

<input type="hidden" name="surveyList[#{i}].usedfunc_F" id="surveyList[#{i}].usedfunc_F" value="false" />
<input type="checkbox" onclick="jhtoggle('surveyList[#{i}].usedfunc_F')" checked="checked" />

Javascript

<script type="text/javascript">
function jhtoggle(obj) {
   var jht = document.getElementById(obj);
   jht.value = (jht.value !='true' ? 'true' : 'false');
}
</script>

答案 1 :(得分:2)

这是我自己的解决方案,基本上是一种手动执行grails数据绑定应该做的(但不是)的解决方法:

Map<String,String> checkboxes = params.findAll{def i = it.key.endsWith("._fixiert")} // all checkboxes
checkboxes.each{
    String key = it.key.substring(0, it.key.indexOf("._fixiert"))
    int tagIdx = Integer.parseInt(key.substring(key.indexOf('[')+1, key.indexOf(']')))
    int zuwIdx = Integer.parseInt(key.substring(key.lastIndexOf('[')+1, key.lastIndexOf(']')))
    if(params.get(key+".fixiert"))
    {
        dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = true
    }
    else
    {
        dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = false                    
    }
}

Works,不需要改变grails本身,但不可重复使用(可能可以通过一些额外的工作来实现)。

答案 2 :(得分:1)

我会创建一个小示例应用程序来演示问题并将其附加到Grails错误(或创建一个新错误)。这里的某个人可能能够调试您的示例应用程序,或者您已经证明该错误并未真正修复。

答案 3 :(得分:1)

我认为最简单的解决方法是附加一个调试器,看看为什么Grails无法填充该值。考虑到Grails是开源的,您将能够访问源代码,一旦找到解决方案,您就可以修补您的版本。

我还发现了另一个错误GRAILS-2861,它提到了与绑定绑定有关的问题(参见Marc在帖子中的评论)。我想这正是你所描述的问题。

答案 4 :(得分:0)

试试这个,将日志设置为DEBUG,如果他们没有显示问题,请尝试前3个,将它们全部翻到DEBUG:

codehaus.groovy.grails.web.servlet="error"  //  controllers
codehaus.groovy.grails.web.pages="error" //  GSP
codehaus.groovy.grails.web.sitemesh="error" //  layouts
codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping
codehaus.groovy.grails."web.mapping"="error" // URL mapping
codehaus.groovy.grails.commons="info" // core / classloading
codehaus.groovy.grails.plugins="error" // plugins
codehaus.groovy.grails.orm.hibernate="error" // hibernate integration

这应该可以让您准确了解参数设置何时以及如何失败,并可能找出解决方法。