绑定多个复选框以在Grails中列出

时间:2012-12-11 19:58:14

标签: list grails binding checkbox

看起来很简单,但显然很难。将(有限且已知长度)系列复选框绑定到grails命令对象上的布尔列表。当然可以“填充”命令对象以使用先前选择的值恢复视图。

例如我有一个grails webflow。它首先将4个复选框绑定到布尔列表中的条目。它切换到下一个状态并打印值 - 例如[真,真]。向后导航,所有复选框都为空(这非常有意义 - 4个复选框,只有两个值)。所以它应该是例如[false,true,false,true]。

无论我做什么,我似乎都无法实现这一目标。在春天它会很容易,只需将复选框绑定到值[0] .. [3] ...为什么在Grails中这么简单这么简单?!

请帮助,这真的会让我的一天成真!

示例命令Obj:

class TestCmdObj {    
    List<Boolean> boolListOne = []
}

控制器中的示例绑定方法(在流程操作中执行的闭包):

private def doBindAndValidateBoolList = {       
    bindData(flow.testCmdObj, params, [include:['boolListOne']])
}

到目前为止一切顺利。这实际上在流程中显示下一页时有效,testCmdObj.boolListOne对于选中的复选框显示为true。

GSP代码很简单,使用:

<g:checkBox name="boolListOne"/>
<g:checkBox name="boolListOne"/>
<g:checkBox name="boolListOne"/>
<g:checkBox name="boolListOne"/>

在下一个视图中,我可以打印出$ {testCmdObj.boolListOne}并打印出尽可能多的“真实”值,就像我检查的那样..(例如[true,true])如果我向后导航,则复选框是emtpy ......我再也能理解,因为它们都有相同的名字......

2 个答案:

答案 0 :(得分:0)

好的,所以以this为参考:

  

Grails需要一个包含现有列表的命令,该命令将被填充   来自请求的数据。

所以你需要做的是:

<击>     class TestCmdObj {
        列表boolListOne = ListUtils.lazyList([],FactoryUtils.instantiateFactory(Boolean))     }

此外,您的gsp需要迭代您的命令以显示每个条目,例如:

<g:each in="${myCommandInstance.boolListOne}" var="boolInstance" status="i">
<g:checkbox name="boolListOne[${i}]" value="${boolInstance}" />
</g:each>

这样,gsp中的每个复选框都将对应列表中的一个条目。

编辑:似乎对于原始类型的包装器,不需要使用工厂。

答案 1 :(得分:0)

希望最终确定上述建议/评论之间的所有内容。

  1. 如果您声明复选框的迭代并调用它们
<g:each in="someIteration" var="a">
  <g:checkBox name="something" value="${a.someCondition}" 
  checked="${a.someCondition}" />
</g:each>

您的控制者将在 String[L] 有点像String[] something的验证对象 尽管您仍将其声明为List something=[]

只要最终用户选择了多个复选框,此方法也将起作用。并且您的验证对象将在此时List something=[]

上述问题是,如果选择1,则该参数以string而不是list的形式被接收

如果您不依赖于对象的自动绑定,那么上面的操作没什么问题,

List myList = params.list('something')

这时,grails会将1或倍数转换为列表。但这不会将单个复选框绑定到验证列表元素。

要从验证的角度解决此问题,将其声明为List something=[]

<g:each in="someIteration" status="i" var="a">
  <g:checkBox name="something[${i}]" value="${a.someCondition}" 
   checked="${a.someCondition}" />
</g:each>

现在,无论选择1个复选框还是多个复选框,都将在something之类的['null','whatever','null','null']列表下进行选择。

使用status字段并将名称从something重命名为something[${i}]