Joh*_*anB 1 spring spring-mvc thymeleaf spring-boot
我正在创建一个 html 页面,其中的表单只包含一个字段:cardId. 用户需要使用读卡器(类似键盘的输入)填写此字段。当cardId验证失败时,用户可以重试(例如不完整的读取)。当然,这只有在先前输入被清除的情况下才有可能。
我在我的 gradle 构建中使用以下依赖项
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
Run Code Online (Sandbox Code Playgroud)
两个请求映射:
@RequestMapping(value = "/search", method = RequestMethod.GET)
public String cardSearch(CardSearch cardSearch) {
return "search";
}
@RequestMapping(value = "/search", method = RequestMethod.POST)
public String cardResult(@Valid CardSearch cardSearch, BindingResult result, Model model) {
if(result.hasErrors()) {
return "search";
} else {
...
}
}
Run Code Online (Sandbox Code Playgroud)
表单对象
public class CardSearch {
@CustomValidator(message = "Card not found...")
private String cardId;
Getter and setter
}
Run Code Online (Sandbox Code Playgroud)
我正在使用自定义验证器来验证 cardId
@Override
public boolean isValid(String cardField, ConstraintValidatorContext cxt) {
Card card = find card by cardField;
if(card == null) {
return false;
} else {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
形式
<div th:errors="${cardSearch.cardId}"></div>
<form action="#" th:action="@{search}" th:object="${cardSearch}" method="post">
<input type="text" th:field="*{cardId}" autofocus="autofocus" size="50" showPassword="true" />
</form>
Run Code Online (Sandbox Code Playgroud)
当验证失败时,会向用户显示错误消息,但错误的 cardId 在输入字段中。一种可能的解决方案是使用密码输入字段(浏览器清除输入),但随后输入被屏蔽。有什么更好的方法来清除cardId?
[编辑] 添加了 github 示例https://github.com/JohanBas/FormReset
小智 5
其实我有一个类似的问题,但反过来。如果发生错误,我希望我的值不会被删除。我也在使用th:field,它现在对我有用。
即使在使用@Valid 之后,我也需要使用new FieldError手动添加字段错误。
因此,如果您这样做,该字段的值不会被清除:
bindingResult.addError(
new FieldError("formObject", "field", formObject.getField(), true, null, null,
messageSource.getMessage("you.fail", null , Locale.getDefault())));
Run Code Online (Sandbox Code Playgroud)
如果您这样做,该字段的值将被清除:
bindingResult.addError(new FieldError("formObject", "field",
messageSource.getMessage("you.fail", null , Locale.getDefault())));
Run Code Online (Sandbox Code Playgroud)
见的构造FieldError尤其是一个与rejectedValue:
/**
* Create a new FieldError instance.
* @param objectName the name of the affected object
* @param field the affected field of the object
* @param rejectedValue the rejected field value
* @param bindingFailure whether this error represents a binding failure
* (like a type mismatch); else, it is a validation failure
* @param codes the codes to be used to resolve this message
* @param arguments the array of arguments to be used to resolve this message
* @param defaultMessage the default message to be used to resolve this message
*/
public FieldError(
String objectName, String field, Object rejectedValue, boolean bindingFailure,
String[] codes, Object[] arguments, String defaultMessage) {
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10411 次 |
| 最近记录: |