在 Grails 中,如何在 g:select 中捕获多个选定项目?

Posted

技术标签:

【中文标题】在 Grails 中,如何在 g:select 中捕获多个选定项目?【英文标题】:In Grails how do I capture multiple selected items in g:select? 【发布时间】:2010-09-04 20:59:45 【问题描述】:

我有一个联系人域类,它可以与多个组织相关联,这些组织也是域类。我想使用一个多选框来允许用户选择与当前联系人关联的组织。选择框填充了可用的组织。如何将所选项目分配给我的联系人类中的组织列表?

 <g:select name="organizations.id"  
           multiple="multiple" 
           optionKey="id" 
           from="$com.ur.Organization.list()" 
           value="$contact?.organizations" />

以上是我目前正在尝试的,虽然它确实填充了组织的选择,但它似乎没有将所选项目放在我的组织字段中。

感谢您的建议。

编辑: 合并了来自 krsjunk 和 omarello 的 cmets。

这是域类的缩写版本。

class Contact
    static searchable = true
    static mapping = 
        sort "lastName"
    
    String firstName
    String lastName
    .  
    .
    .
    static belongsTo = [organizations:Organization, projects:Project]


class Organization 
    static searchable = true
    static mapping = 
        sort "name"
    
    String name
    static hasMany = [contacts:Contact]

【问题讨论】:

尝试将您的姓名更改为 name="organizations.id" 【参考方案1】:

只要把名字改成

<g:select name="organizations"  multiple="multiple" 
          optionKey="id" 
          from="$com.ur.Organization.list()" 
          value="$contact?.organizations" />

应该没问题,刚刚试了一下。

注意我的域定义是这样的,(以防万一你有不同的东西

class Contact 

    static constraints = 
    

    static hasMany = [organizations:Organization]

    String name



class Organization 

    static constraints = 
    

    static hasMany = [contacts:Contact]
    static belongsTo = [Contact]

    String name

【讨论】:

非常适合单项选择,但是当我选择多个项目时,我会遇到异常,因为选择返回代表 id 的字符串列表而不是对象列表。 嗯,你有一个几乎相似的域定义。如上所述。我刚刚尝试了通过多项选择创建的示例,它似乎工作正常,可以保存和检索。你得到什么异常? 啊,我的 hasMany 映射是从组织到联系人。联系人“属于”组织。这似乎是问题所在。我将更新问题以更好地说明。无论如何,这是一个例外。执行控制器 [com.ur.ContactController] 的操作 [save] 导致异常:groovy.lang.MissingMethodException:没有方法签名:com.ur.Organization.get() 适用于参数类型:(java.lang.String, java.lang.String) 值:[2, 3] 可能的解决方案:get(java.lang.Object), getId(), getAt(java.lang.String), getAll(), ident(), getLog() Servlet :圣杯【参考方案2】:

一个问题是value="contact?.organizations" 应该是value="$contact?.organizations" — 不确定这是否是整个问题。 (另外,如果 value 是一个集合,则属性 multiple=".." 不是必需的)

您可能还需要name="contact.organizations" 成为name="contact.organizations.id" 和另一个属性optionKey="id"

【讨论】:

进行了更改,但没有运气。我确实尝试删除多个,但这使选择成为单行选择,所以我将其添加回来。 抱歉,如果不设置示例,很难查看所有部分……您是否尝试过 value="$contact?.organizations?.id" (假设它应该提供一组 ID organizations 是 hasMany 关系中的列表) 你是对的,组织是来自 hasMany 关系的列表。我尝试使用 $contact?.organizations?.id 但仍然没有任何内容保存到列表中。我的“from”属性是否会返回组织的“toString”表示,它不会映射到组织列表?【参考方案3】:

在您新编辑的域示例中,联系人和组织之间没有一对多的关系。您有一个来自组织的一对多联系人。

所以

value="$contact?.organizations"

将永远是单个项目,而不是列表。

尝试为联系人选择/分配多个组织永远不会有效。

【讨论】:

我明白你的意思。我将如何更新组织列表,以便它们包含对使用列表中选择的组织的联系人的引用? 是的,krsjunk 提到的是正确的,您将联系人定义为属于一个组织,即只有一个。你需要定义一个 has many 来实现你想要的。由于一个联系人可以关联多个组织(根据您的初始要求) 如果您希望多个组织与给定联系人关联,则必须更改域模型,使其看起来更像他的答案中提出的一个 omarello。 我认为可能有一种方法可以在不改变我的域模型的情况下实现这一点,但它需要自定义标记库和可能的控制器代码。当/如果我得到它的工作,我会报告。

以上是关于在 Grails 中,如何在 g:select 中捕获多个选定项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 3 中更改应用程序名称?

如何在 Grails 中嵌入 jqPlot?有啥特殊标签吗?

如何在 Grails 2.0 中运行本地插件?

如何在grails中编写accessDeniedHandler

如何在 Grails 3.0 中使用 jQuery

如何在 Grails 2.4 中外部化 Maven 凭证