Iam尝试使用百里香叶将一个简单的形式发布到弹簧控制器上。支持bean包含一个布尔值,该值使用th:object标记内的th:字段映射到模板中的复选框。当我看一下渲染的html DOM时,spring mvc正在添加一个隐藏的输入字段,其名称为_attributeName。主输入字段的名称生成为attributeName。现在当Iam尝试发布表单时,它会以400中止,因为请求参数_attributeName不能映射到支持bean对象(根本就不存在)。所以另外请求wohld包括attributeName和_attributeName。为什么会这样?
答案 0 :(得分:2)
所以我终于解决了它。问题是,我使用boolean而不是Boolean,而我的getter命名为isEnabled而不是getEnabled。这似乎导致了表单元素和辅助bean之间映射的问题。
答案 1 :(得分:-2)
尝试过Vinc提及的解决方案,但对我不起作用。但是下面对我有用。
控制器
@Controller
public class BaseController {
@GetMapping("/")
private String index(DemoDto demoDto){
return "index";
}
@PostMapping("/")
private String receiveValues(DemoDto demoDto) {
System.out.println(demoDto);
return "index";
}
}
DTO
public class DemoDto {
private String name;
private boolean global;
//getter setter for name
public boolean isGlobal() {
return global;
}
public void setGlobal(boolean global) {
this.global = global;
}
//toString()
}
HTML
<body>
<form th:action="@{/}" th:method="post" th:object="${demoDto}">
<label>Enter Name:</label>
<input type="text" th:field="*{name}" name="name">
<br/>
<label>Global</label>
<input type="checkbox" th:field="${demoDto.global}"/>
<input type="submit" value="Submit">
</form>
</body>
最重要的是如何定义th:field="${demoDto.global}"
。这里$
和对象名demoDto
都是必需的。
将生成html代码。
<body>
<form action="/" method="post">
<label>Enter Name:</label>
<input type="text" name="name" id="name" value="">
<br/>
<label>Global</label>
<input type="checkbox" id="global1" name="global" value="true"/>
<input type="hidden" name="_global" value="on"/>
<input type="submit" value="Submit">
</form>
</body>
从ui提交时收到:
DemoDto [name=Dev, global=true]