我有一个用例,我需要首先在GSP页面上首先显示enum
的值作为下拉列表,让用户选择其中一个值然后最终将数据绑定到域。
所以我在GSP上的代码看起来像我的枚举MyEnum
<g:select from="${MyEnum.getAllEnumList()}" optionValue="name" name="duration"/>
我的枚举
public enum MyEnum {
MIN15('15 Minutes'),
MIN30('30 Minutes'),
HOUR1('1 Hour'),
HOUR2('2 Hours'),
HOUR5('5 Hours'),
HOUR8('8 Hours'),
HALFDAY('half day'),
FULLDAY('full day')
private final String name
private final String displayName
public static final List<MyEnum> getAllEnumList() {
[MIN15,MIN30,HOUR1,HOUR2,HOUR5,HOUR8,HALFDAY,FULLDAY]
}
public String toString() {
return displayName
}
MyEnum(String name,String displayName) {
this.name = name
this.displayName = displayName;
}
}
当我点击页面时,它显示如下错误:
Error processing GroovyPageView: Error executing tag <g:form>: Error evaluating expression [MyEnum.getAllEnumList()] on line [37]: java.lang.NoClassDefFoundError: Could not initialize class ENUM.MyEnum at D:/myspace/projects/IcepushpluginSampleApp/grails-app/views/util/test.gsp:46
任何想法????
答案 0 :(得分:9)
这就是我过去的做法。这样你就得到了i18n的支持。
GSP
<g:select name="duration" from="${MyEnum.values()}" valueMessagePrefix="ENUM.MyEnum" />
messages.properties
ENUM.MyEnum.MIN15=15 Minutes
ENUM.MyEnum.MIN30=30 Minutes
ENUM.MyEnum.HOUR1=1 Hour
ENUM.MyEnum.HOUR2=2 Hours
ENUM.MyEnum.HOUR5=5 Hours
ENUM.MyEnum.HOUR8=8 Hours
ENUM.MyEnum.HALFDAY=half day
ENUM.MyEnum.FULLDAY=full day
答案 1 :(得分:2)
<%@ page import="fully.qualified.path.MyEnum" %>
在GSP顶部试试这个(当然,将完全限定的路径调整到你的包裹中)。
编辑(这应该有效(你的枚举语法也是错误的)):
<%@ page import="ENUM.MyEnum" %>
<html>
<head>
</head>
<body>
<g:select from="${MyEnum.getAllEnumList()}" optionValue="displayName" name="duration"/>
</body>
</html>
然后是修订后的课程:
package ENUM
public enum MyEnum {
MIN15('15 Minutes'),
MIN30('30 Minutes'),
HOUR1('1 Hour'),
HOUR2('2 Hours'),
HOUR5('5 Hours'),
HOUR8('8 Hours'),
HALFDAY('half day'),
FULLDAY('full day')
private final String displayName
public static final List<MyEnum> getAllEnumList() {
[MIN15,MIN30,HOUR1,HOUR2,HOUR5,HOUR8,HALFDAY,FULLDAY]
}
public String toString() {
return displayName
}
MyEnum(String displayName) {
this.displayName = displayName;
}
}
EDIT2:
避免整个事情的最简单方法(这里的第二个答案和我的解决方案)是简单地将值列表从控制器传递给gsp。只需添加
[duration:MyEnum.values()]
或与您的控制器类似的东西返回。
答案 2 :(得分:2)
如果您使用custom tag library,则可以避免导入GSP(这有点难看)。如果您希望选项键与其值不同,您还需要向getKey()
添加其他方法(enum
)。
<强> MyEnum.groovy 强>
enum MyEnum {
MIN15('15 Minutes'),
MIN30('30 Minutes'),
HOUR1('1 Hour'),
HOUR2('2 Hours'),
HOUR5('5 Hours'),
HOUR8('8 Hours'),
HALFDAY('half day'),
FULLDAY('full day')
final String displayName
private MyEnum(String displayName) {
this.displayName = displayName
}
String getKey() {
name()
}
String toString() {
displayName
}
}
<强> MyEnumTagLib.groovy 强>
// add import if MyEnum is in a different package
class MyEnumTagLib {
static namespace = 'my'
def enumSelect = { attrs ->
attrs.from = MyEnum.values()
attrs.optionKey = 'key'
out << g.select(attrs)
}
}
<强> GSP 强>
<my:enumSelect name="duration"/>