2011-07-29 10 views
7

我有一個用例,我需要首先在GSP頁面上顯示enum的值作爲下拉列表,讓用戶選擇其中一個值,然後最終將數據綁定到域。在GSP頁面上顯示枚舉值,然後將它們綁定到數據庫中

所以我對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 

有任何想法嗎 ????

回答

9

這是怎麼I H大家過去做過。這樣你有國際化的支持。

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 
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()] 

或類似於您的控制器返回的內容。

+0

它已經在那裏像 –

+0

<%@頁面進口=「ENUM。MyEnum」的contentType =‘text/html的;字符集= UTF-8’%> –

+0

首先,你的語法是錯誤的,大寫的東西是一個變量名,而不是一個參數,所以,你可以刪除的名稱部分 其次。 ,你不需要添加的contentType屬性導入類。 第三,在這裏工作時,我與你的類測試,將更新的答案有一個要點。 –

2

如果您使用custom tag library,則可以避免導入到您的GSP(這很醜陋)。如果您想使選項密鑰與其值不同,您還需要爲您的enum添加另一種方法(getKey())。

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"/> 
相關問題