我正在学习Spring Boot和thymeleaf,我知道的是在模式形式内进行验证,而无需重定向它,只需在此步骤中混淆即可。
我的班级模型
public class Class {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty
@NotBlank
private String className;
public Class(@NotEmpty @NotBlank String className) {
this.className = className;
}
}
HTML可以显示模式
<div class="modal fade" id="addModal" tabindex="-1" th:fragment="modal-add" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Add Classroom</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<form th:action="@{/addclass}" th:object="${class}" method="post">
<div class="modal-body">
<div class="form-group">
<label for="className">Class Name</label>
<input type="text" class="form-control" id="className" th:field="*{className}" placeholder="Name of Class">
<div class="text text-danger" th:if="${#fields.hasErrors('className')}" th:errors="*{className}">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="submit" value="Save" class="btn btn-primary">Save</button>
</div>
</form>
</div>
</div>
</div>
类控制器
@PostMapping("/addclass")
public String addClass(@Valid @ModelAttribute("class") Class kelas, BindingResult result) {
if(result.hasErrors()) {
//what to do here ? to show error validation without closing modal?
}else{
classService.addClass(kelas);
}
return "redirect:/classlist";
}
答案 0 :(得分:0)
目前尚不清楚您要达到的目标;因此这是基于您的代码的通用答案。如果有任何错误,只需添加错误即可,然后仅返回原始映射。它不会重定向到任何其他页面,并且会在网页上显示错误。您的代码示例代码为-
@PostMapping("/addclass")
public String addClass(@ModelAttribute("class") @Valid Class kelas, BindingResult result) {
if(result.hasErrors()) {
return "addClass";
}
//else is not required here. If there are errors, it is returned before reaching here anyways.
classService.addClass(kelas);
return "redirect:/classlist";
}
您的html应该像(仅错误部分)-
<div class="text text-danger" th:if="${#fields.hasErrors('className')}" th:errors="*{className}">
<p>Incorrect Class Name</p>
</div>
您还可以在模式类本身或application.properties或最终的静态类中指定错误消息,并将其与响应一起发送。
您不熟悉其他几点-避免将name用作Class作为类名。在以后的时间和点上会造成混乱,不是一个好习惯。请使用适当的类名称,即此Modal类应表示的名称。其次,我相信构造器也不需要@NotEmpty
和@NotBlank
。
答案 1 :(得分:0)
在方法addClass中,您必须返回视图外观。
if(result.hasErrors()) {
return "login";
}
登录是您显示登录页面的页面。在登录页面中,您必须处理如下错误:
<span th:if="${#fields.hasErrors('className')}" th:errors="*{className}">Class name Error</span>
答案 2 :(得分:0)
在 thymeleaf 中使用开放模式进行表单验证有点棘手。这是我的解决方案:
在您的控制器函数中添加“RedirectAttributes atts”。 添加值为 true 的属性 hasErrors。
@PostMapping("/addclass")
public String addClass(@Valid @ModelAttribute("class") Class kelas, BindingResult result, RedirectAttributes atts) {
if(result.hasErrors()) {
atts.addAttribute("hasErrors", true);
return "classlist";
}else{
classService.addClass(kelas);
}
return "redirect:/classlist";
}
在您的 html 文件中,您使用 th:inline 和 th:if 添加条件 JS 代码。所以如果任何字段有错误,JS-Code 将被执行。在 JS-Code 中,您可以打开模态。
<div class="modal fade" id="addModal" tabindex="-1" th:fragment="modal-add" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<script th:inline="javascript" th:if="${#fields.hasErrors('*')}">$("#addModal").modal("show");</script>
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Add Classroom</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<form th:action="@{/addclass}" th:object="${class}" method="post">
<div class="modal-body">
<div class="form-group">
<label for="className">Class Name</label>
<input type="text" class="form-control" id="className" th:field="*{className}" placeholder="Name of Class">
<div class="text text-danger" th:if="${#fields.hasErrors('className')}" th:errors="*{className}">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="submit" value="Save" class="btn btn-primary">Save</button>
</div>
</form>
</div>
</div>
</div>