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完整而干净的例子