如何跳过p:ajax中的验证阶段

时间:2014-07-30 21:37:11

标签: jsf jsf-2 primefaces jsf-2.2

我今天在工作中碰到了这个问题。长话短说我想在使用p:ajax组件时跳过验证阶段(实际上也没有检查必需属性),尽管我想在bean中更新模型。

说明问题:

查看:

<h:form>
    <p:messages id="msg" />
    <p:selectBooleanCheckbox value="#{bean.flag}">
        <p:ajax listener="#{bean.flagChanged}" update="@form" />
    </p:selectBooleanCheckbox>
    <p:inputText value="#{bean.value}" required="true"
        disabled="#{bean.flag}" validator="#{bean.validate}">
        <p:ajax event="keyup" update="msg" />
    </p:inputText>
    <p:commandButton />
</h:form>

豆:

public class Bean {
    private Integer value;
    private Integer prevValue;
    private boolean flag;

    public void flagChanged() {
        if (!flag) {
            value = prevValue;
        } else {
            prevValue = value;
            value = null;
        }
    }

    // value and flag setters and getters

    public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) {
        Integer number = (Integer) value;

        if (number == 7) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "7 is my lucky number", ""));
        }
    }
}

复选框用于禁用和启用输入文本,同时在禁用时隐藏值,并在启用时恢复它。当用户填写错误的值并立即验证并因此未更新到bean中时,会出现问题。因此,在单击并取消选中复选框之后,将恢复之前的正确值删除上一个值并留下空白字段时会发生同样的情况(required设置为true,因此会恢复以前的值。)

我尝试设置immediate=true,但这没有任何改变,所以我想知道是否有任何方法可以跳过p:ajax中的验证阶段。也许我试图以不完全正确的方式实现这一点(任何提示都赞赏!),但我想知道这种方法是否有可能实现。

2 个答案:

答案 0 :(得分:3)

我认为有内置的解决方案可以解决这个问题。由于似乎没有人存在,我提出我的解决方法来解决这个问题(虽然它不是我的问题的答案,因为验证仍在处理中,我只是忽略了我自己的验证器中的验证)。

<h:form>
    <p:messages id="msg" />
    <p:selectBooleanCheckbox value="#{bean.flag}">
        <p:ajax listener="#{bean.flagChanged}" update="@form" />
    </p:selectBooleanCheckbox>
    <p:inputText value="#{bean.value}"
        required="#{not empty param[submitButton.clientId]}" disabled="#{bean.flag}"
        validator="#{bean.validate}">
        <p:ajax event="keyup" update="msg" />
    </p:inputText>
    <p:commandButton action="#{bean.submit}" update="@form" binding="#{submitButton}">
        <f:param name="validate" value="true" />
    </p:commandButton>
</h:form>

验证方法:

public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) {
    Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    if (!params.containsKey("validate")) {
        return;
    }
    Integer number = (Integer) value;

    if (number == 7) {
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "7 is my lucky number", ""));
    }
}

答案 1 :(得分:1)

我能想到的一种方法是使用<p:commandButton>ajax="false"来提交表单。此外,在验证器方法中,添加以下行以检查值的ajax提交:

if (FacesContext.getCurrentInstance().isPostback()) return;

在这种情况下,使用immediate="true"中的<p:ajax>无效,因为<p:inputText>组件仍会像往常一样进行转换和验证。唯一的区别是它会比页面上的其他组件更早地完成此过程。希望这会有所帮助:)