我需要跨多个字段进行验证,以便仅在违反其中一个给定字段时才应违反验证。
它不同于交叉字段验证,其中一个字段的值取决于其余一个字段的值。
下面给出一个简单的场景。
<p:inputText id="txt1" value="#{testBean.txt1}" required="false" maxlength="45"/>
<p:inputText id="txt2" value="#{testBean.txt2}" required="false" maxlength="45"/>
<p:inputText id="txt3" value="#{testBean.txt3}" required="false" maxlength="45"/>
<p:commandButton id="btnSubmit" actionListener="#{testBean.insert}"
icon="ui-icon-check" value="Save"/>
其中,仅当给定的三个文本字段之一留空时,才应发生验证违规。如果其中任何一个都填充了一个值,那么所有都应该被验证。在这种情况下,不应违反验证。
如何处理此方案? JSF / PrimeFaces是否提供了一种以这种方式执行验证的方法?
答案 0 :(得分:3)
我很难围绕您的具体功能要求,但我相信您正在寻找“全部或全部”验证。即要么所有字段都应为空,要么填写所有字段。 JSF实用程序库OmniFaces具有用于此目的的验证器<o:validateAllOrNone>
。
以下是您可以使用它的方法:
<p:inputText id="txt1" value="#{testBean.txt1}" maxlength="45" />
<p:inputText id="txt2" value="#{testBean.txt2}" maxlength="45" />
<p:inputText id="txt3" value="#{testBean.txt3}" maxlength="45" />
<o:validateAllOrNone components="txt1 txt2 txt3" />
答案 1 :(得分:2)
Primefaces提供了许多令您满意的方法。首先,您可以在MBean方法中进行验证。在您的情况下,您正在调用insert
方法,因此您可以执行以下操作:
public String insert(){
boolean error = false;
if(txt1.isEmpty()){
error = true;
}
if(txt2.isEmpty()){
error = true;
}
if(txt3.isEmpty()){
error = true;
}
if(error == true){
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Empty fields!", "Insert something in at least one input!"));
return null;
}else{
return "myPage"
}
}
请注意,您可以根据自己的需要自行改进验证。您还可以更改以下消息:
FacesMessage.SEVERITY_WARN
为:
FacesMessage.SEVERITY_INFO
FacesMessage.SEVERITY_ERROR
FacesMessage.SEVERITY_FATAL
什么可以为您的应用程序提供更好的错误消息。
<小时/> 在此之前,请将其添加到输入字段上方:
<p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />
可能这会像魅力一样!如果您有兴趣,请查看Primefaces Messages showcase,在那里您可以找到一些示例,并更好地了解<p:messages>
的工作原理。
另外,请随意查看<p:growl>
,我认为这比简单的消息好很多。在这里查看growl。
希望我帮助过你(