如何将th:field绑定到循环中的单选按钮的值

时间:2016-05-30 06:47:53

标签: html spring spring-boot radio-button thymeleaf

在我的HTML中,我遍历了一个玩家列表(spieler)。

<th:block th:each="spieler : ${runde.spieler}" >

每个玩家应该在同一组中拥有一个未经检查的单选按钮。当选中一个单选按钮时,我想将值绑定到特定播放器的属性。该属性是一个布尔字段(zerrissen)

<input type="radio" th:value="${spieler.zerrissen}" th:field="*{runden[__${rundeStat.index}__].spieler[__${spielerStat.index}__].zerrissen}" />

对于复选框,绑定工作正常。但是使用单选按钮无法正常工作。

<input type="checkbox" th:field="*{runden[__${rundeStat.index}__].spieler[__${spielerStat.index}__].gegangen}"/>

如何在循环中将单选按钮绑定到模型的布尔属性?

编辑:

简单来说,我有三个spieler。每个spieler都有一个布尔属性:spieler.zerrissen。并且每个spieler在视图上都有一个单选按钮。如果我点击spieler 1的单选按钮并提交表单,则#{1}} - @ModelAttribute spieler的spieler 1`应为true。我怎样才能做到这一点?

绑定到我的模型是有效的,因为我使用spieler.zerrissen属性。但是使用th:field也意味着每个单选按钮的生成名称不同,因此我可以检查每个单选按钮而不仅仅是一个。

3 个答案:

答案 0 :(得分:2)

单选按钮不适合在百里香中使用。一组单选按钮应该都具有相同的th:字段(并选择单选按钮将该字段设置为所选值)。您不能拥有一组映射到不同字段的单选按钮。

我认为你有两种选择:

  1. 使用映射到th:对象上的新字段的单选按钮。您将添加一个getter和setter,其中getter将遍历spieler并返回第一个spieler的索引,其中zerrissen == true,setter将获取spieler的索引并在该对象上设置zerrissen = true(和false)在所有其他)。单选按钮的值将是每个spieler的索引。

  2. 某种javascript解决方案(使用复选框和javascript /服务器端验证,以确保他们只选择一个)。

答案 1 :(得分:0)

这是因为您同时使用th:valueth:field标记。 根据文件 <input th:field="${someThing}" />将生成
<input id="someThing" name="someThing" />

但是对于所有的无线电按钮你需要相同的name,这就是它无法工作的原因。

所以,试试这个:

UPD尝试将值设置为0或1而不是true或false:

<th:block th:each="spieler, iterStat : ${runde.spieler}" >
    <input type="radio" th:id="'spieler'+${iterStat.count}" 
           th:value="${spieler.zerrissen ? '1' : '0'}" name="spieler.zerrissen" th:checked=${spieler.zerissen} />

答案 2 :(得分:0)

我刚刚完成了一个有效的解决方案。这对初学者来说有点棘手。

@Controller
@GetMapping("/radio") 
public String radioButton(@ModelAttribute("foo") Foo foo, ModelMap model) {
    model.addAttribute("cts", contMet());                   
    return "radio"; 
}

帮助方法contMet()对我来说是一个解决方案:

public List<String> contMet() {

        List <String>cm = new ArrayList<>();
        Iterator <Foo> iter =  cTR.findAll().iterator(); //cTR is a repository for the Foo class.
        while(iter.hasNext()) {
            cm.add(iter.next().getType());
        }
        return cm;
    }

模板:

<div th:each="mo: ${cts}" th:object="${foo}">
   <input type="radio" th:field="*{type}"  th:value="${mo}" th:text="${mo}" />
</div>  

Foo对象:

Public class Foo{
        @Id
        private String conId = UUID.randomUUID().toString();
        private String type; 
    ---etc
    --getters and setters