首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用spring-boot-starter-web和胸腺叶时填充下拉列表

使用spring-boot-starter-web和胸腺叶时填充下拉列表
EN

Stack Overflow用户
提问于 2018-06-05 02:59:22
回答 1查看 462关注 0票数 0

我正在尝试创建一个使用spring-boot-starter-web和胸腺叶的web应用程序。作为起点,我使用了Spring的验证表单输入入门指南(https://spring.io/guides/gs/validating-form-input/),因为“这些指南旨在让您尽可能快地提高工作效率--使用Spring团队推荐的最新Spring项目版本和技术。”

我已经将年龄输入字段更改为从服务填充的年龄下拉列表。我修改后的代码如下:

代码语言:javascript
复制
package hello;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Controller
public class WebController implements WebMvcConfigurer {
    @Autowired
    AgeService ageService;
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/results").setViewName("results");
    }
    @GetMapping("/")
    public String showForm(Model model) {
        PersonForm personForm = new PersonForm();
        model.addAttribute("personForm", personForm);
        List<Integer> validAges = ageService.getValidAges();
        model.addAttribute("validAges", validAges);
        return "form";
    }
    @PostMapping("/")
    public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "form";
        }
        return "redirect:/results";
    }
}

<!doctype html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
<form action="#" th:action="@{/}" th:object="${personForm}" method="post">
    <table>
        <tr>
            <td>Name:</td>
            <td><input type="text" th:field="*{name}"/></td>
            <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td>
        </tr>
        <tr>
            <td>Age:</td>
            <td><select th:field="*{age}">
                <option value="">Please select ...</option>
                <option th:each="validAge:${validAges}" th:value="${validAge}" th:text="${validAge}"></option>
            </select></td>
            <td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td>
        </tr>
        <tr>
            <td>
                <button type="submit">Submit</button>
            </td>
        </tr>
    </table>
</form>
</body>
</html>

第一次显示表单时,一切正常,但如果出现验证错误并重新显示表单,则下拉菜单中只会显示“请选择..“选项。

建议使用哪种技术来实现此功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 04:32:27

下拉列表未填充,因为在bindingResult对象发现错误后,在返回表单之前,似乎没有将validAges列表作为属性添加到模型中。

请添加:

模型模型,作为checkPersonInfo的参数,如下所示

代码语言:javascript
复制
   CheckPersonInfo(Model model, ...) 

将validaAges添加到bindingResult.hasErrors块中的模型中,如下所示

代码语言:javascript
复制
if(bindingResult.hasErrors()){
   model.addAttribute("validAges", ageService.getValidAges());
   return "form";
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50687129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档