【问题标题】:grails render list of checkboxesgrails 渲染复选框列表
【发布时间】:2013-08-30 16:48:21
【问题描述】:

我在网上搜索了将近一天,但似乎找不到解决问题的方法。
我有一个名为 Hobby 的查找表,其中有很多爱好(露营、远足、骑自行车等)。在引导期间填充爱好表。 Grails 创建一个带有 id 和 description 字段的爱好表。

我有一个名为申请人的域对象。申请人可以有零个或多个爱好。我已经这样声明了域:

class Applicant {

    static hasMany = [hobbies:Hobby]
List <Hobby> hobbies = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(Hobby.class));

}

在我的控制器中,我为页面使用了一个命令对象,允许申请人选择他们的爱好。定义为:

class LifestyleCommand {

    List <Hobby> hobbies = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(Hobby.class));
}

我的 gsp 看起来像这样:

                <g:each var="item" in="${Hobby.list()}" status="i">

                    <g:set var="newline" value="${(i % 3) == 0 ? 'newline' : ''}" />

                    <div class="formcheckbox columns3 ${newline}">
                        <g:checkBox name="hobbies_${item.id}" optionKey="id" value="${item.id}" />
                        <label>${item.description}</label>
                    </div>

                </g:each>

页面将正确显示页面中的所有爱好。但是,当我尝试将表单提交回控制器时,LifeStyleCommand 对象中的列表为空。我不确定我的 gsp 是否正确设置了 g:checkBox 变量,也不确定我是否在命令对象中正确声明了 List 。一旦我将数据发送回控制器,我要克服的下一个问题是将数据从命令对象复制到申请人。任何帮助将不胜感激。

我尝试在命令中只使用一个普通的 List,但 grails 在提交表单时抱怨类型转换。

编辑:

这是我要工作的内容:

class Applicant {

    static hasMany = [hobbies:Hobby]
//I removed the List <hobby>... code
...
}

我的命令对象:

class LifestyleCommand {
    Set <Hobby> hobbies;
}

gsp:

            <g:each in="${Hobby.list()}" var="hobby">
                <g:set var="checked" value="${ command?.hobbies.find{h->h.id == hobby.id } != null }" />
                <g:checkBox value="${checked}" name="${ 'hobby' +'[' + hobby.id + ']'}"/>${hobby.description}</td>
            </g:each>

还有我的新控制器代码:

Hobby.list().each{hobby->
    if (params["hobby[${hobby.id}]"] == 'on') {
        applicant.addToHobbies(hobby)
    }
    else if (applicant.getHobbies().contains(hobby)) {
        applicant.removeFromHobbies(hobby)
    }
}

一切正常。可能有更好的方法,我还没有进行任何重构,但让它工作是一个起点。

【问题讨论】:

  • 你能发布你的控制器吗?
  • 我通过一些额外的研究发现了这一点,并注意了我得到的例外情况。一个很好的起点是谷歌搜索“复选框组”,即使我不知道这个词,这也是我所追求的。然后我在这里找到了一个引用 Acegi 插件示例的帖子:grails.org/AcegiSecurity%20Plugin%20-%20Basic%20Tutorial 创建示例应用程序并查看用于创建用户的源代码。它处理多个复选框和具有很多关系。从那里我必须让它在我的命令对象中工作。
  • 首先我从我的域和命令对象中删除了这些行:列出 爱好...

标签: grails grails-orm gsp


【解决方案1】:

问题在于您的GSP。当您需要一个对象列表时,您必须为您的复选框维护一个标准名称:

<g:checkBox name="hobbies[$i].id" ... />

这将正确映射到您的命令列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多