我有一个Springboot& Thymeleaf项目正在生成相同的名称"在我的人输入。
控制器看起来像:
@GetMapping("/newEpisode")
public String episodeForm(Model model) {
model.addAttribute("episode", new Episode());
List<Country> countries = countryRepository.findAll();
Set<String> roles = new HashSet<>();
roles.add("Admin");
model.addAttribute("primaryPerson1",new EpisodePerson());
model.addAttribute("primaryPerson2",new EpisodePerson());
model.addAttribute("roles", roles);
model.addAttribute("countries", countries);
return "episode";
}
我的一些HTML看起来像:
<input type="text" class="form-control person surname" style="text-transform: uppercase" data-property="surname" placeholder="SURNAME" th:field="${primaryPerson1.person.surname}"/>
但是,此标记的HTML中生成的名称不是唯一的:
<input type="text" class="form-control person surname" style="text-transform: uppercase" data-property="surname" id="surname1" placeholder="SURNAME" name="person.surname" value="">
为什么html中的所有人物标签共享相同的名称,例如我有两个:
name="person.surname"
答案 0 :(得分:1)
您误用了th:field
属性。
它的目的是将您的输入与表单支持bean中的属性绑定。因此,您应该为每个对象创建单独的表单,并以下列方式使用它:
<!-- Irrelevant attributes omitted -->
<form th:object="${primaryPerson1}">
<input th:field="*{person.surname}"/>
</form>
...或创建一个表单支持bean,它将两个对象组合在一起,例如:
public class EpisodeFormBean {
private List<EpisodePerson> episodePersons;
//getter and setter omitted
}
...然后将其添加到episodeForm
方法中的模型中......
EpisodeFormBean episodeFormBean = new EpisodeFormBean();
episodeFormBean.setEpisodePersons(Arrays.asList(new EpisodePerson(), new EpisodePerson()));
model.addAttribute("episodeFormBean", episodeFormBean);
...并在模板中使用它,如下所示:
<!-- Irrelevant attributes omitted -->
<form th:object="${episodeFormBean}">
<input th:field="*{episodePersons[0].person.surname}"/>
<input th:field="*{episodePersons[1].person.surname}"/>
</form>
在第二个解决方案中,生成的名称将是唯一的。我认为它更适合您的需求。
您应该查看Tutorial: Thymeleaf + Spring,因为它已经得到了很好的解释。特别是你应该注意到一个短语:
th:field
属性的值必须是选择表达式(*{...}
), 鉴于它们将在评估中得到评估,这是有道理的 表单支持bean而不是上下文变量(或模型 Spring MVC术语中的属性。)