如何制作p:selectOneMenu的特定selectItem?

问题描述 投票:0回答:1
    <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。

jsf primefaces
1个回答
0
投票

[当输入字段的验证取决于某些自定义和复杂条件时(在您的情况下确实非常不正常),解决方案之一是为输入字段定义自定义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中可能还有其他解决方法。

另一方面,老实说,一旦我有类似的要求:一些法律团队坚持要求始终列出所有“下拉”选项,并且如果选择了“不正确/不允许”选项,则明确告知用户。从工程的角度来看,这对我来说很奇怪,但是我认为从法律的角度来看这是有道理的。

© www.soinside.com 2019 - 2024. All rights reserved.