如何使用Thymeleaf和Spring启动从下拉列表中提取所选值

时间:2017-01-12 21:26:50

标签: spring-boot thymeleaf html.dropdownlistfor

我已经使用我的Spring Controller(provincia)中的内容填充了一个列表,我还有另一个对象(profile2),我需要从(provincia)获取所选值...以及我的表单国家/地区中的其他值等...

@RequestMapping(value = "/editprofileabout4", method = RequestMethod.GET)
public ModelAndView editProfileAbout4(ModelAndView modelAndView) {

    Usuario usuario = getUsuario();
    Profile profile = profileService.getUserProfile(usuario);
    Profile2 profile2 = profile2Service.getUserProfile2(usuario);
    List<Provincia> provincia = provinciaService.readAllProvincia();

    Profile webProfile = new Profile();
    webProfile.safeCopyFrom(profile);

    modelAndView.getModel().put("edituserprofile2th", usuario);
    modelAndView.getModel().put("editprofile2about2th", profile2);
    modelAndView.getModel().put("editprovincia2th", provincia);
    modelAndView.setViewName("editprofileabout4");

    return modelAndView;
}

@RequestMapping(value = "/doeditprofileabout4", method = RequestMethod.POST)
public ModelAndView editProfileAbout4(ModelAndView modelAndView, @Valid Profile2 profile2, @Valid Provincia provincia,  BindingResult result) {

    modelAndView.setViewName("editprofileabout4");

    System.out.println("       !!!!!!!!!!!!! PROFILE2a: " + profile2.getBirthdate());
    System.out.println("       !!!!!!!!!!!!! PROFILE2b: " + profile2.getGender());
    System.out.println("       !!!!!!!!!!!!! PROFILE2d: " + profile2.getProvincia());
    System.out.println("       !!!!!!!!!!!!! PROFILE2x: " + provincia.toString());

    Usuario usuario = getUsuario();
    Profile2 profile = profile2Service.getUserProfile2(usuario);
    profile.setCountry(profile2.getCountry());
    profile.setGender(profile2.getGender());
    profile.setBirthdate(profile2.getBirthdate());
    profile.setProvincia(provincia);

    if (!result.hasErrors()) {
        profile2Service.save(profile);
        modelAndView.setViewName("redirect:/editprofileabout4");
    }
    return modelAndView;

}

在我的HTML中,我有:

<form class="sky-form" id="sky-form4" action="#" th:object="${editprofile2about2th}" th:action="@{/doeditprofileabout4}" method="post">

    <section>
    <div class="col-lg-3">
            <select class="form-control" th:object="${editprovincia2th}" id="ddl" name="ddl">
            <option value="" th:text="#{editprofile.about4.provincia}">Seleccionar Provincia</option>
            <option th:each="dropDownItem : ${editprovincia2th}"
                                                    th:value="${dropDownItem.id_provincia}"
                                                    th:text="${dropDownItem.provincia}"></option>
            </select>
        </div>
    </section>

但我找不到任何有关如何提取与列表中的值对应的选定键和值(th:select)并将其返回到控制器(或将其移动到具有provincia有线对象)。在Post之后,我在我的控制器中获得了provincia的空值。

当我在HTML中包含一个(select th:field =&#34; * {provincia}&#34;)时,它会给我一个错误说...出现意外错误(type = Internal Server Error) ,status = 500)。 执行处理器期间出错&org.thymeleaf.spring4.processor.attr.SpringSelectFieldAttrProcessor&#39; (editprofileabout4:120) 无效的财产&'; provincia&#39; bean类[java.util.ArrayList]:Bean属性&quot; provincia&#39;不可读或getter方法无效:getter的返回类型是否与setter的参数类型匹配?

感谢您的帮助 - 任何文件都表示赞赏。

1 个答案:

答案 0 :(得分:0)

您需要从th:object元素中删除select属性,并且只为表单保留一个属性,因为正如Thymeleaf文档所述:

  

进入标签后,没有其他th:object属性可以   指定。这与HTML表单不可能的事实一致   嵌套。

然后表单上的

th:object属性需要引用一个表单支持bean,即可以保存您通过表单发送的任何值的对象,例如省报

目前您正在尝试访问List对象的属性 provincia ,而该对象根本不存在。