我有多种形式,在那里我有必填字段和可选字段。
要提交这样的形式我要求要执行所要求的属性验证,工作正常。 要取消这样的形式我使用属性immediate="true"
的p:commandbutton
,这使得它的动作发生在应用请求中值 -PHASE如下问题: 如何点击一个特定的按钮时跳过验证?
但是,对于大型表单我想提供一个保存键式的用户,这样他就可以继续以后。
对于刚刚保存当前状态,我也想忽略所需属性的验证。 然而,使用immediate="true"
是行不通的,因为那时我保存方法简单节省什么,因为JSF生命周期从来没有碰到“UpdateModelValues”相。 (Acording到http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html )
那么,如何跳过所需检查,但不能跳过一半的生命周期?
每一个按钮,只要它是形式的成员创建的帕拉姆名录中的条目。 所以我简单的申请是进入了“必需的”参数的情况下进行检查:
<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
,然后转动表达true
这样执行验证。
当我点击“保存”的param['form:save']
为NOT NULL
,这样就解决了(但空!) false
因此在验证时被忽略。 (或者假设JSF认为这是不是由于表达必填字段beeing评估为false
)
如果你想跳过验证按钮,然后单击伊斯利要跳过它添加参数按钮时。 例:
<p:commandButton value="button1" action="#{bean.action()}" >
<f:param name="skipValidator" value="true"/>
</p:commandButton>
然后,在验证你可以阅读该参数,如果它是真的,那么跳过它:
@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
- 因此在参数[...]你只能指定按钮ID
- 您正在使用语法
="{true and ...}"
这可能是一个错误(无#
)? - 正如你可以从自己的编辑历史看“空或不空”的逻辑是不是很直观:)这就是为什么我立刻喜欢上了
!empty ...
版本时,我偶然发现了它。
对别人提出的另一种方法是使用自定义BeanValidator
将验证表单如果说,点击与ID按钮保存。 任何其他按钮没有隐含定义执行验证不会验证只是提交您的相关资料。 找到完整的非常干净的例子在这里
在我来说,我没有找到在PARAMS按钮的ClientID的,但我发现这个param['javax.faces.source'] = buttonClientId
在requestmap。 该值将是点击的按钮的clientId。
我用skipValidators这种情况下(假设所有验证跳过)。 从代码omnifaces
<h:form>
<h:dataTable value="#{bean.items}" var="item">
<h:column>
<h:inputText value="#{item.value}" required="true" />
</h:column>
</h:dataTable>
<h:commandButton value="add new row" action="#{bean.add}">
<o:skipValidators />
</h:commandButton>
<h:commandButton value="save all data" action="#{bean.save}" />
<h:messages />
</h:form>