【问题标题】:Grails Binding between multiselect, enum , command object and domain class多选、枚举、命令对象和域类之间的 Grails 绑定
【发布时间】:2014-09-09 10:06:56
【问题描述】:

我正在开发一个使用多选字段的项目。

我的域类定义为:

class RoomWanted{

  Set<MateAgeRange> mateAgeRanges

}

然后:

public enum MateAgeRange {
   TWENTIES('18-29')
   ,THIRTIES('30-39')
   ,FOURTIES("40-49")
   ,FIFTIES("50-59")
   ,SIXTIES("60+")



    final String value

    private MateAgeRange(String value) {
        this.value = value
    }

    String toString() { value }
    String getKey() { name() }


    static belongsTo=[roomWanted:RoomWanted]
}

我的命令对象是:

class RoomWantedDetailsCommand implements Serializable {

      Set<MateAgeRange> mateAgeRanges
}

我想要创建页面、编辑页面、显示页面

这是我的创建页面

<g:select name="mateAgeRanges" multiple="true" from="${MateAgeRange?.values()}"  optionKey="key" />

我的命令对象'cmd'获取值

print cmd.mateAgeRanges

给出值 [30-39, 50-59] 当我选择这两个时。

但它不绑定到域类中的字段。 在展示页面中, 如果我使用 cmd.mateAgeRanges 它返回 []。

【问题讨论】:

  • 为什么你有一个已经由域类表示的东西的命令对象?
  • 在控制器中用于简化在客户端创建、编辑和验证数据的过程。

标签: grails enums command


【解决方案1】:

领域类应该定义为:

class RoomWantedDetailsCommand implements Serializable {

      Set<MateAgeRange> mateAgeRanges

      static hasMany = [ mateAgeRanges:MateAgeRange ]
}

枚举定义为:

public enum MateAgeRange {
   TWENTIES('18-29')
   ,THIRTIES('30-39')
   ,FOURTIES("40-49")
   ,FIFTIES("50-59")
   ,SIXTIES("60+")



final String value

private MateAgeRange(String value) {
    this.value = value
}

String toString() { value }
String getKey() { name() }


static belongsTo=[roomWanted:RoomWanted]
}

在编辑页面中:

  <g:select name="mateAgeRanges" multiple="true" from="${MateAgeRange?.values()}" optionKey="key" value="${roomWanted?.mateAgeRanges}"/>

在展示页面中: ${roomWanted?.mateAgeRanges }

在创建页面中

【讨论】:

    【解决方案2】:

    将 hasMany 添加到您的 RoomWanted 课程中

    class RoomWanted{
    
      Set<MateAgeRange> mateAgeRanges
    
      static hasMany = [ mateAgeRanges:MateAgeRange ]
    
    }
    

    如果你不这样做,GORM 不会全自动填充这个关联。

    那么你应该使用roomWanted.addToMateAgeRanges(..)来填写值

    【讨论】:

    • 谢谢。它在创建和显示页面中正常工作。这些值存储在数据库中。但是在编辑页面中,当我使用 它不显示来自的值分贝选择。值实际上来自数据库。
    • 你需要添加@value:&lt;g:select name="mateAgeRanges" multiple="true" from="${MateAgeRange?.values()}" optionKey="key" value="${roomWanted?.mateAgeRanges}"/&gt;
    • 非常感谢。它完美地工作。我为此苦苦挣扎了 2 天。在这里,我认为存储在 db 中的值是 18-29、20-29 等。出于搜索目的,我需要 TWENTIES、THIRTEES、FOURTEES 等。当前代码中是否需要进行任何更改。
    • 你可以以某种方式使用 `valueOf()' 方法。我从来没有用过,所以你必须尝试一下:)
    • 这已经是第三个问题了。你现在应该已经被禁言了
    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2015-12-12
    • 1970-01-01
    • 2011-08-06
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多