【问题标题】:How can I bind th:field to value of a radio button in a loop如何将 th:field 绑定到循环中单选按钮的值
【发布时间】:2016-09-27 21:43:28
【问题描述】:

在我的 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 的单选按钮并提交表单,则 spieler 1 的 @ModelAttribute spieler - spieler.zerrissen 应该为真。我怎样才能做到这一点?

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

【问题讨论】:

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


    【解决方案1】:

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

    @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
    

    【讨论】:

      【解决方案2】:

      单选按钮不适合在 thymeleaf 中以这种方式使用。一组单选按钮应该都具有相同的 th:field (并且选择一个单选按钮将该字段设置为所选值)。不能有一组映射到不同字段的单选按钮。

      我认为你有两个选择:

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

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

      【讨论】:

        【解决方案3】:

        这是因为您同时使用了th:valueth:field 标签。 根据文档 &lt;input th:field="${someThing}" /&gt; 会生成
        &lt;input id="someThing" name="someThing" /&gt;

        但您需要为所有单选按钮使用相同的name,这就是它不起作用的原因。

        所以,试试这个:

        UPD 尝试将值设置为 0 或 1 而不是真或假:

        <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} />
        

        【讨论】:

        • 感谢您的回答。但是绑定到模型不起作用。有什么解决办法吗?
        • 对不起,绑定似乎不起作用。我需要 bin 这个字段:*{runden[__${rundeStat.index}__].spieler[__${spielerStat.index}__].zerrissen 我应该在哪里设置这个输入?对于复选框,这有效。 (更新问题)
        猜你喜欢
        • 1970-01-01
        • 2020-01-19
        • 2011-03-29
        • 2017-02-12
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        相关资源
        最近更新 更多