我正在开发一个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中标记为固定,并且那里描述的问题机制(隐藏字段名称中的下划线放在错误的位置)不是出现在我的案例中。
任何想法可能是什么原因?
答案 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
这应该可以让您准确了解参数设置何时以及如何失败,并可能找出解决方法。