JSF不需要立即执行就跳过Required-Validation = true

我有多种forms,我有必填字段和可选字段。

提交这样一个表单,我需要对需要执行的属性进行validation,这很好。 要取消这种forms,我使用p:commandbutton上的属性immediate="true" ,这使得它的行为发生在Apply Request Values -Phase期间,如下所示: 当单击一个特定的button时如何跳过validation?

但是,对于大型表单,我想为用户提供一个Save-Button,所以他可以稍后进行。

为了保存当前状态,我也想忽略必需属性的validation。 但是,使用immediate="true"不起作用,因为那么我的save方法简单地不会保存任何内容,因为JSF生命周期永远不会碰到“UpdateModelValues”-Phase。 (根据http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html )

那么,如何绕过必需的检查,但不跳过生命周期的一半呢?

只要它是表单的成员,每个Button在Param-List中创build一个条目。 所以我简单地应用一个检查是否存在到“required”参数的条目:

 <h:form id="form" prependId="true"> ... <p:inputText id="someId" required="#{param['form:save']==null}" ... /> ... <p:commandButton id="save" value="Save" /> <p:commandButton id="submit" value="Submit" /> <p:commandButton id="cancel" value="Cancel" immediate="true" /> </h:form> 

当我点击“提交”时, param['form:save']NULL ,然后将expression式变为true以便执行validation。

当我点击“保存”时, param['form:save'] NOT NULL (但是是空的!),它parsing为false所以validation被忽略。 (或者让我们说JSF认为这是不是一个必需的字段,由于expressionbeeing评估为false

如果你想在点击button时跳过validation,那么很容易地将参数添加到你想要跳过它的button。 例:

 <p:commandButton value="button1" action="#{bean.action()}" > <f:param name="skipValidator" value="true"/> </p:commandButton> 

然后在validation器中,你可以读取这个参数,如果它是真的,那么跳过它:

 @FacesValidator("com.validators.MyValidator") public class MyValidator implements Validator{ public void validate(FacesContext ct, UIComponent co, Object obj) throws ValidatorException { if(!continueValidation()){ return; } // validation process } protected boolean continueValidation() { String skipValidator= FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("skipValidator"); if (skipValidator != null && skipValidator.equalsIgnoreCase("true")) { return false; } return true; } } 

这是一个很好的问题和一个非常有用的答案。 这种方法可以避免immediate="true"的麻烦。

我想添加这个信息(但我不允许评论呢)。 你的代码示例似乎需要JSF 2.0或更高版本(纠正我)。 如果你像我一样使用JSF 1.1 / 1.2,那么考虑这些改变/添加:

 <h:form id="form"> ... <p:inputText id="someId" required="#{!empty param['save']}" ... /> ... <p:commandButton id="save" value="Save" /> </h:form> 
  • JSF 1.1中没有prependId属性
  • 因此,在参数中只能指定buttonID
  • 你正在使用一个语法="{true and ...}"可能是一个错误(不# )?
  • 正如你可以从你自己的编辑历史中看到的那样,“null或者not null”的逻辑不是非常直观的:)这就是为什么当我偶然发现它的时候,我立即喜欢这个“ !empty ...版本。

在我的情况下,我没有在params中findbutton的clientId,但是我发现这个param['javax.faces.source'] = buttonClientId在requestmap中。 该值将是被点击的button的clientId。

别人提出的另一种方法是使用自定义的BeanValidator来validation表单,如果说,点击id保存button。 任何其他未隐式定义的button都不会进行validation,只是提交可用的数据。 在这里find完整而干净的例子

Interesting Posts