Thymeleaf下拉选择

时间:2016-11-07 18:40:03

标签: java html spring-boot thymeleaf

我正在将Thymeleaf用于我的一个java项目。 现在,我想要实现的是,当我从下拉列表中选择其他内容时,而不是默认值“ALL”,然后按提交按钮[POST],以获取有关所选项目的详细信息。我希望在提交后保留选择项目显示在下拉列表中。它现在做了什么,它返回到默认值。如果我添加到所选代码下面提供的代码属性,那么它将从列表中选择所有项目,这也是不可接受的,因为它最终总是显示列表的最后一项。

<div class="controls">
    <select class="form-control" name="example" id="example">
        <option value="0">ALL</option>
        <option th:each="user : ${allUsers}" th:value="${user.id}" th:text="${user.name}">
        </option>
    </select>
</div>

我的控制器获取列表,我保持尽可能简单:

@ModelAttribute("allUsers")
public List<User> allUsers() {
    List<User> userList= repo.findAll();
    return userList;
}

我还要注意,我的目标是:

<form class="form-search" action="#" method="post"
      th:action="@{/combinedsearch}"
      th:object="${combinedreport}">

所以使用这样的东西的想法不起作用

<select th:field="*{user}">,因为我的对象实际上并没有将User作为字段。

有什么想法吗?帮助

2 个答案:

答案 0 :(得分:3)

基本上我所做的是在一个CombinedReport控制器中,我提取了我在HTML表单提交后收到的user_ID,然后我将它用于我需要在后端做的任何事情,然后我将该user_id发送回前面结束,只需将其作为属性添加到模型中:

model.addAttribute("lastselected", userId);

然后我在User的对象中创建了自定义逻辑方法:

public boolean isSelected(Integer userId){
        if (userId != null) {
            return userId.equals(id);
        }
        return false;
    } 

然后我将我的百万美元模板中的代码修改为:

<select class="form-control" name="example" id="example">
     <option value="0">ALL</option>
     <option th:each="user : ${allUsers}"
             th:value="${user.id}"
             th:selected="${user.isSelected(lastselected)}"
             th:text="${user.name}">
     </option>
</select>

和baaaam!它就像一个魅力!

答案 1 :(得分:0)

无需在后端实现该方法,只需使用SPEL表达式eq

<select class="form-control" name="example" id="example">
 <option value="0">ALL</option>
 <option th:each="user : ${allUsers}"
         th:value="${user.id}"
         th:selected="${user.id eq lastselected}"
         th:text="${user.name}">
 </option>

注意:在遍历ENUM时,请记住调用.name(),以便比较字符串值。