2015-04-08 13 views
19

Tôi có một đối tượng miền có thuộc tính enum và tôi muốn hiển thị một danh sách thả xuống với tất cả các giá trị enum có thể có trong biểu mẫu cho đối tượng này. Hãy tưởng tượng các đối tượng sau đây:Làm thế nào để hiển thị tất cả các giá trị enum có thể trong danh sách thả xuống bằng Spring và Thymeleaf?

public class Ticket { 

    private Long id; 

    private String title; 

    private State state; 

    // Getters & setters 

    public static enum State { 
    OPEN, IN_WORK, FINISHED 
    } 

} 

Trong điều khiển của tôi, tôi có một phương pháp mà ám một hình thức cho đối tượng này:

@RequestMapping("/tickets/new") 
public String showNewTicketForm(@ModelAttribute Ticket ticket) { 
    return "tickets/new"; 
} 

Mẫu trông như thế này:

<form th:action="@{/tickets}" method="post" th:object="${ticket}"> 
    <input type="text" th:field="*{title}" /> 
    <select></select> 
</form> 

Sau đó nó nên được chuyển thành nội dung như sau:

<form action="/tickets" method="post"> 
    <input type="text" name="title" /> 
    <select name="state"> 
    <option>OPEN</option> 
    <option>IN_WORK</option> 
    <option>FINISHED</option> 
    </select> 
</form> 

Làm cách nào để tạo thẻ được chọn? Giá trị được lựa chọn cũng nên được ánh xạ tới các vé tự động để tôi có thể làm điều gì đó như thế này trong bộ điều khiển:

@RequestMapping(value = "/tickets", method = RequestMethod.POST) 
public String createTicket(@Valid Ticket ticket) { 
    service.createTicket(ticket); 

    return "redirect:/tickets"; 
} 

Trả lời

43

Bạn có thể làm:

<select> 
    <option th:each="state : ${T(com.mypackage.Ticket.State).values()}" 
      th:value="${state}" 
      th:text="${state}"> 
    </option> 
</select> 
+2

Mục đích của T là gì? – saml

+2

Cú pháp EL mùa xuân của nó để truy cập một kiểu và gọi các phương thức tĩnh hoặc nhận các thuộc tính tĩnh trong nó. Xem http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-types – jchampemont

+1

Ngày 'th: value = $ {{state}}' sử dụng thẻ chuyển đổi –

15

Bên cạnh đó, nếu bạn muốn tách riêng enum tên thứ tự từ chuỗi hiển thị trong giao diện, thêm các thuộc tính bổ sung, ví dụ như một displayName :

public static enum State { 

    OPEN("open"), 
    IN_WORK("in work"), 
    FINISHED("finished"); 

    private final String displayName; 

    State(String displayName) { 
     this.displayName = displayName; 
    } 

    public String getDisplayName() { 
     return displayName; 
    } 
} 

Và trong tập tin html:

<select> 
    <option th:each="state : ${T(com.mypackage.Ticket.State).values()}" th:value="${state}" th:text="${state.displayName}"></option> 
</select> 

này sẽ trình bày các displayName cho người sử dụng và cho phép bạn thay đổi âm thầm chuỗi này sau mà không refactoring mã. Bạn có thể thêm các thuộc tính khác như thứ: tiêu đề theo cách này.

+0

Làm thế nào chúng ta có thể đạt được kết quả tương tự bằng cách ghi đè toString, hoặc chúng ta không thể? – atas

+0

@ vâng, bạn có thể ghi đè toString() – Nikki

Các vấn đề liên quan