【发布时间】:2021-09-28 03:00:20
【问题描述】:
我有这个选择:
<p:selectOneMenu value="#{bean.val}">
<f:selectItem itemValue="X" itemLabel="Select" />
<f:selectItems value="#{bean.getVals()}" />
<p:ajax update="wrapper" />
</p:selectOneMenu>
这是它更新的包装器:
<p:panel id="wrapper">
<p:panel rendered="#{bean.val == 'A' or bean.val == 'B'}">
<!-- insert your code here -->
</p:panel>
</p:panel>
包装器在选择之外,处于同一级别。
一开始,一切都好。包装器已隐藏。
如果我选择“A”然后选择“C”,例如,包装消失。 但是,如果我再次选择'A'或'B'和'X'(第一个“选择”,选择),包装器确实不会消失!
我在bean.val 的setter 中放置了一个断点。为 第一个 的所有选项 BUT 调用的设置器,调试器内的值与 前一个 相同!
但是!如果我删除 验证器,它工作!
这是验证器:
@FacesValidator(value="requiredSelect")
public class RequiredSelect implements Validator {
protected MessageUtil messageUtil = new MessageUtil();
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String val = (String) value;
if ("X".equals(val)) {
FacesMessage msg = this.messageUtil.getDefaultValidationError();
throw new ValidatorException(msg);
}
}
}
之前我使用过另一个验证器:
@FacesValidator(value="requiredString")
public class RequiredString implements Validator {
protected MessageUtil messageUtil = new MessageUtil();
@Override
public void validate(
FacesContext context,
UIComponent component,
Object value
) throws ValidatorException {
String val = (String) value;
if (val == null || val.trim().isEmpty()) {
FacesMessage msg = this.messageUtil.getDefaultValidationError();
throw new ValidatorException(msg);
}
}
}
但它确实不工作,因为在菜单更改时 空字符串 没有保存到支持 bean。因此,例如,如果您选择“A”然后返回“”(选择)并尝试提交表单,则选择会发出错误信号,但值 的选择返回为 'A'!所以虚假的“X”值。
我正在使用 Primefaces 3.4.1 和 Mojarra 2.1.7
【问题讨论】:
标签: jsf primefaces