有条件地跳过验证,当空f:selectItem in p / h:selectOneMenu被选中

时间:2015-07-25 09:21:20

标签: validation jsf primefaces selectonemenu

父母:

<p:selectOneMenu id="parentList"
                 value="#{bean.selectedParent}"
                 converter="#{parentConverter}"
                 required="true">

        <f:selectItem itemLabel="Select" itemValue="#{null}"/>

        <f:selectItems var="parent"
                       value="#{bean.parentList}"
                       itemLabel="#{parent.parentName}"
                       itemValue="#{parent}"/>

        <p:ajax update="childrenList" listener="#{bean.setchildren}"/>
</p:selectOneMenu>

儿童:

<p:selectOneMenu id="childrenList"
                     value="#{bean.selectedchild}"
                     converter="#{childConverter}"
                     required="true">

        <f:selectItem itemLabel="Select" itemValue="#{null}"/>

        <f:selectItems var="child"
                       value="#{bean.childrenList}"
                       itemLabel="#{child.childName}"
                       itemValue="#{child}"/>
</p:selectOneMenu>

托管bean:

@Named
@ViewScoped
public class Bean implements Serializable {

    @Inject
    private Service service;

    private Parent selectedParent;
    private Child selectedChild;
    private List<Parent> parentList;
    private List<Child> childrenList;

    private static final long serialVersionUID = 1L;

    public Bean() {}

    @PostConstruct
    private void init() {
        parentList = service.getParentList();

        // Not necessary unless selectedParent is already available in edit mode.
        if(selectedParent != null) {
            childrenList = service.getChildrenListByParent(selectedParent);
        }
    }

    public void setChildren() {
        if(selectedParent != null) {
            childrenList = service.getChildrenListByParent(selectedParent);
        } else {
            childrenList = null;
        }
    }

    // Getters and setters.
}

子列表将根据其父级填充,即子列表应仅包含与特定父级关联的子级。

当选择父列表中的第一个父项时,子项列表应重置为空,即子项不应在没有父项的情况下可见。

由于父列表具有必需的字段验证器,因此会导致验证。当选择父列表中的第一个项目时,将阻止子列表因required="true"而更新。技术上没有任何错误,但没有父母的孩子的存在可能会给最终用户带来不愉快的经历。

应该发生的情况是,当选择父列表中的第一项时,它不应导致验证,即有条件地跳过验证。

执行此操作的一种方法是检查selectedChildchildrenList本身是否为空/空。如,

required="#{empty selectedChild or empty childrenList}"

但在这种情况下,这似乎不是有条件地跳过验证的规范方式。

当选择父列表中的第一项时,是否存在跳过验证的更好方法,以便子列表以及父列表也可以清空(验证应该在所有其他情况下引起。例如。 ,当表单本身同步或异步提交时?)

1 个答案:

答案 0 :(得分:3)

基本上,您需要依赖于操作的验证。即在调用特定$calls = mysql_result(mysql_query("SELECT calls FROM ae8vo_survey WHERE people_id = '1'"), 0); echo $calls; 操作时跳过验证,而不是在其他操作上跳过验证。

遗憾的是,在视图中宣布这一点并非微不足道。有几个技巧/解决方法。最常用的是检查是否(未)调用特定操作。

E.g。通过HTTP request parameter map <p:ajax>确认implicit EL object中是否存在客户ID,检查是否调用了所需的保存按钮:

#{param}

或者通过确定组件自己的客户端ID是否不等于具有预定义名称<h:form> <p:selectOneMenu ... required="#{not empty param[save.clientId]}"> ... <p:ajax ... /> </p:selectOneMenu> <p:selectOneMenu ... required="true"> ... </p:selectOneMenu> <p:commandButton binding="#{save}" ... /> </h:form> 的HTTP请求参数来检查组件自己的<p:ajax>是否未被调用。 ajax请求(下面的javax.faces.source是一个表示当前UIComponent的隐式EL变量):

#{component}

或者检查父表单是否由UIForm#isSubmitted()提交,该表单只会在&#34;完整表单提交时评估<h:form> <p:selectOneMenu ... required="#{param['javax.faces.source'] ne component.clientId}"> ... <p:ajax ... /> </p:selectOneMenu> <p:selectOneMenu ... required="true"> ... </p:selectOneMenu> <p:commandButton ... /> </h:form> 。用作true process="@form"默认为<p:ajax process>,不会触发&#34;完整表单提交&#34;和@this默认值到<p:commandButton process>,这将触发&#34;完整表格提交&#34;):

@form

或者通过UIComponent#getNamingContainer()引用表单来绑定表单(如果您知道组件树中的位置;如果表单是例如2个命名容器父项,则使用<h:form binding="#{form}"> <p:selectOneMenu ... required="#{form.submitted}"> ... <p:ajax ... /> </p:selectOneMenu> <p:selectOneMenu ... required="true"> ... </p:selectOneMenu> <p:commandButton ... /> </h:form> ):< / p>

#{component.namingContainer.parent.namingContainer.submitted}

接受你的选择。第一个解决方案之前已经提供过几次,因为它最容易理解并且由初学者调整。

另见: