复选框值在 false 时不绑定到对象?

Posted

技术标签:

【中文标题】复选框值在 false 时不绑定到对象?【英文标题】:Checkbox values do not bind into object when false? 【发布时间】:2012-02-02 04:06:49 【问题描述】:

我使用 ModelAttribute 在 Spring Web 应用程序中绑定对象。

一旦我注意到,如果一个对象的布尔值 A 为真,如果我们取消选中 A 的复选框,它的值将不会更新

例如,我有一个具有属性“活动”= true 的课程对象。 在“编辑课程”视图中,我制作了一个绑定到“活动”的复选框。如果复选框被选中(绑定对象反映了更改),一切都会很好,但是如果我们取消选中复选框,对象课程不会改变。

进一步的研究告诉我,这是因为复选框值可能不会被浏览器提交(这是 html 的设计)。所以我只好用丑陋的request.getParameter来检查是否设置了值。

我刚来this question,我看到asp.net mvc 提供了一种更优雅地解决它的方法。我认为 Spring 必须提供类似的东西。有人知道怎么做吗?

以下是我的代码:

控制器代码:

    @RequestMapping(value="/test", method = RequestMethod.POST)
    public String processEditLesson(@Valid Lesson lesson, BindingResult bindingResult, Model model) 
        System.out.println("Lesson is active: " + lesson.isActive()); // still "true" even if the checkbox is unset

        // Current work-around
        String isActive = request.getParameter("active");
        if (StringUtils.isNotNullOrEmpty(isActive)) 
            lesson.setActive(true);
         else 
            lesson.setActive(false);
        
        ...
    

查看代码:

<form id="lesson" class="EditorForm" action="$rc.getContextUrl('/test.html')" method="post" >

    <fieldset>
        <legend><@spring.message code="lesson.edit"/></legend>
        <@spring.formHiddenInput "lesson.id" />
        <@spring.formHiddenInput "lesson.studio.id" />

        <div class="Entry">
            <label for="name"><@spring.message code="lesson.message"/></label>
            <@spring.formInput "lesson.message" />
            <span class="ErrorMessage"><@spring.showErrors "<br/>" /></span>
        </div>

        <input type="checkbox" name="active" checked="checked" />
        <label for="active">$rc.getMessage('lesson.active')</label>

        <input type="submit" value="<@spring.message code='common.update' />" />
    </fieldset>
</form>

【问题讨论】:

【参考方案1】:

Spring 有一个内置的解决方法。

只需将这个额外的隐藏字段添加到表单中:

&lt;input type="hidden" value="on" name="_active"/&gt;

带有前导下划线的参数是某种标记,表示存在同名但不带下划线的复选框参数。

如果仅提交 _active=on,Spring 现在应该将 lesson.active 设置为 false。

【讨论】:

谢谢,你怎么知道这种方式的?我的意思是,我已经搜索了很多,但没有找到任何结果。只是一个小修复:我需要使用“_active”而不是“_lesson.active”来使其工作。 我已更正名称。 ——我怎么知道?我以专业的方式从事 Spring MVC 超过 5 年。当我开始时,这个问题非常受欢迎。顺便说一句:如果您使用 Spring 复选框 jsp 标签,则隐藏文件已包含在内。 有用的信息。但是我发现如果元素名称包含.,则该值不会自动更改。我想我必须使用 javascript 更改它 感谢您提供有用的信息。我一直想知道为什么存在下划线开头的参数。【参考方案2】:

我认为你应该使用 springframework 标签——你为什么使用纯 html?如果您的视图是 JSP 页面,只需导入:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

然后你可以使用:

<form:checkbox path="path" label="label" />

解决问题。

【讨论】:

感谢jsp方法,其实我用的是freemarker。 Freemarker 宏 formCheckBoxes 没有任何示例可以使用它【参考方案3】:

你可以使用 spring 框架标签,它会自动将你选择的值设置为 bean 类,然后很容易在你的控制器类中获取它的值。

在路径上你需要放置你的 bean 变量名

要使用它,您需要为表单提供命令名称并使用该命令名称将 bean 对象绑定到该 jsp

model.addAttribute("command name" , bean object) 在你的控制器中使用这个来绑定对象。

【讨论】:

对不起,我不使用 jsp。我用的是freemarker,如果你知道怎么用freemarker写,请告诉我。现在,我改用自定义宏。

以上是关于复选框值在 false 时不绑定到对象?的主要内容,如果未能解决你的问题,请参考以下文章

复选框值在 setState 中反转

WPF绑定复选框bool?

绑定到角度mat-checkbox的检查属性的方法被多次触发

如何将对象列表绑定到百里香中的复选框?

asp.net core razor 页面复选框模型绑定(始终为 false)

表值在反应中没有变化