<p:selectOneMenu id="console" value="#{selectOneMenuView.console}" style="width:125px">
<f:selectItem itemLabel="Select One" itemValue="" />
<c:if test="${javaMB.pageTypeId eq 1}">
<f:selectItem itemLabel="Xbox One" itemValue="Xbox One" />
</c:if>
<c:if test="${javaMB.pageTypeId eq 2}">
<f:selectItem itemLabel="PS4" itemValue="PS4" />
<f:selectItem itemLabel="Sega" itemValue="Sega" />
</c:if>
<c:if test="${javaMB.pageTypeId eq 3}">
<f:selectItem itemLabel="Wii" itemValue="Wii" />
</c:if>
</p:selectOneMenu>
如何在selectOneMenu中使selectItem成为必需?
如果用户转到第2页,那么我需要将Sega的值设置为必填?
我尝试过
<f:selectItem itemLabel="Sega" itemValue="Sega" required="true"/>
我也尝试过
<f:selectItem itemLabel="Sega" itemValue="Sega" required="javaMB.write"/>
如果用户使用page2,则该项目对于用户选择条件“ javaMB.write”是必不可少的
我不需要整个p:selectOneMenu。
[当输入字段的验证取决于某些自定义和复杂条件时(在您的情况下确实非常不正常),解决方案之一是为输入字段定义自定义FacesValidator(同时将其他值作为组件f:attribute
传递)并实施您自己的验证规则。
xhtml示例
<h:form id="form">
<p:messages id="messages"/>
<p:selectOneMenu id="console" value="#{javaMB.console}"
validator="customValidator">
<f:attribute name="pageTypeId" value="#{javaMB.pageTypeId}" />
<f:selectItem itemLabel="Select One" itemValue="" />
<c:if test="${javaMB.pageTypeId eq 1}">
<f:selectItem itemLabel="Xbox One" itemValue="Xbox One" />
</c:if>
<c:if test="${javaMB.pageTypeId eq 2}">
<f:selectItem itemLabel="PS4" itemValue="PS4" />
<f:selectItem itemLabel="Sega" itemValue="Sega" />
</c:if>
<c:if test="${javaMB.pageTypeId eq 3}">
<f:selectItem itemLabel="Wii" itemValue="Wii" />
</c:if>
</p:selectOneMenu>
<p:commandButton value="Submit" process="@form" update=":form:messages"/>
</h:form>
自定义人脸验证器
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
@FacesValidator(value = "customValidator")
public class CustomValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
//get input field value
String consoleName = (String) value;
//get some other value passed as component's attribute
int pageTypeId = (Integer) component.getAttributes().get("pageTypeId");
System.out.printf("Page type: %d, Console: %s\n", pageTypeId, consoleName);
//if input is required (not null) for page 2, check if input is null
if (pageTypeId == 2 && consoleName == null) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, "Input is required", ""));
}
//then implement any logic based on your requirements. For your unusual case,
if (pageTypeId == 2) {
if (!consoleName.equals("Sega")) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, "Sega is required for page type 2", ""));
}
}
}
}
请注意从工程的角度来看,您的要求是非常不寻常的(正如其他人所评论的那样),并且在UI中可能还有其他解决方法。
另一方面,老实说,一旦我有类似的要求:一些法律团队坚持要求始终列出所有“下拉”选项,并且如果选择了“不正确/不允许”选项,则明确告知用户。从工程的角度来看,这对我来说很奇怪,但是我认为从法律的角度来看这是有道理的。