普遍跳过所需输入的验证参数
Universally skip validation params on required inputs
如何制作一些可以跳过 web 所需验证的按钮(但我仍然想处理所有数据,所以立即等等不可能是真的)。
重要的是一定要通用。目前我在每个必填字段条件中使用一些请求参数。下面的代码示例
<p:inputText value="#{cc.attrs.data.exampleData1}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData2}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData3}"
required="#{param['onlySave'] == null}"/>
<p:commandButton value="Zapisz zmiany"
action="#{cc.attrs.controller.save()}"
update="@form">
<f:param name="onlySave" value="true"/>
</p:commandButton>
这个解决方案很好,因为我可以在每个页面中将此参数添加到按钮并跳过验证,但是当我的保存按钮没有进行任何重定向时,以防保存方法中的某些 java 验证失败,我只是在没有重定向的情况下添加了一些消息,然后我从输入中丢失了所有必需的样式。
是否可以在验证失败时在保存方法中将 onlySave
参数设置为 null
或者可能有更好的解决方案?
编辑: Balus 回答得很好,但使用 bean 验证如:
@Pattern(regexp = "^([^0-9]*)$", message = "only non numbers")
String field;
它处理该字段之外的所有数据。最好只忽略必填字段 属性,而不是验证等
编辑2:
<tr>
<td class="label">
<p:outputLabel id="label" for="#{cc.attrs.componentId}" value="#{cc.attrs.label}"/>
</td>
<td class="value">
<cc:insertChildren/> --here component with componentId
</td>
</tr>
<tr class="errorMessage">
<td class="label"/>
<td class="value">
<p:message id="error" for="#{cc.attrs.componentId}" />
</td>
</tr>
请参阅下面修改后的必填字段代码。您可以根据您的要求使用#{empty param.onlySave} 作为您想要跳过验证的字段。
<p:inputText value="#{cc.attrs.data.exampleData1}"
required="#{not empty param.onlySave}"/>
<p:inputText value="#{cc.attrs.data.exampleData2}"
required="#{not empty param.onlySave}"/>
<p:inputText value="#{cc.attrs.data.exampleData3}"
required="#{not empty param.onlySave}"/>
<p:commandButton value="Zapisz zmiany"
action="#{cc.attrs.controller.save()}"
update="@form">
<f:param name="onlySave" value="true"/>
</p:commandButton>
我想出了一个解决方案:
JSF 页面
<h:form id="form" prependId="false">
<c:if test="#{param['onlySave'] eq true}">
<c:set value="#{false}" target="#{myBean}" property="required"/>
</c:if>
<p:inputText value="#{myBean.required}"/>
<p:growl id="msgs" showDetail="true" />
<p:inputText id="data1" value="#{myBean.data1}"
required="#{myBean.required}" />
<p:inputText id="data2" value="#{myBean.data2}"
required="#{myBean.required}"/>
<p:inputText id="data3" value="#{myBean.data3}"
required="#{myBean.required}"/>
<p:commandButton value="Zapisz zmiany"
action="#{myBean.save}" />
</h:form>
豆子
@ManagedBean
@ViewScoped
public class MyBean implements Serializable{
private String data1, data2, data3;
private boolean required;
@PostConstruct
public void init(){
required = true;
}
public void save() {
System.out.println(data1+", "+data2+", "+data3);
required = false;
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Info","Saved"));
// FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("onlySave", "false");// FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("onlySave"));
}
// ... Getters & Setters
}
到目前为止,我找到的最佳解决方案是:
//p:label and p:message with property for=someId for each input above
<p:inputText id="someId" value="#{cc.attrs.data.exampleData1}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData2}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData3}"
required="#{param['onlySave'] == null}"/>
<p:commandButton value="save only"
action="#{cc.attrs.controller.save()}"
update="@(.ui-message,.ui-outputlabel)">
<f:param name="onlySave" value="true"/>
</p:commandButton>
<p:commandButton value="accept button"
action="#{cc.attrs.controller.accept()}"
update="@form">
</p:commandButton>
保存按钮仅更新所有错误和标签,因此我能够看到转换器错误等,但我没有丢失输入的 required 样式。在此示例中,我只是丢失了输入边框的红色。
如果您在请求ui红色字段的标签中使用 *,请不要更新。ui-outputlabel
如何制作一些可以跳过 web 所需验证的按钮(但我仍然想处理所有数据,所以立即等等不可能是真的)。
重要的是一定要通用。目前我在每个必填字段条件中使用一些请求参数。下面的代码示例
<p:inputText value="#{cc.attrs.data.exampleData1}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData2}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData3}"
required="#{param['onlySave'] == null}"/>
<p:commandButton value="Zapisz zmiany"
action="#{cc.attrs.controller.save()}"
update="@form">
<f:param name="onlySave" value="true"/>
</p:commandButton>
这个解决方案很好,因为我可以在每个页面中将此参数添加到按钮并跳过验证,但是当我的保存按钮没有进行任何重定向时,以防保存方法中的某些 java 验证失败,我只是在没有重定向的情况下添加了一些消息,然后我从输入中丢失了所有必需的样式。
是否可以在验证失败时在保存方法中将 onlySave
参数设置为 null
或者可能有更好的解决方案?
编辑: Balus 回答得很好,但使用 bean 验证如:
@Pattern(regexp = "^([^0-9]*)$", message = "only non numbers")
String field;
它处理该字段之外的所有数据。最好只忽略必填字段 属性,而不是验证等
编辑2:
<tr>
<td class="label">
<p:outputLabel id="label" for="#{cc.attrs.componentId}" value="#{cc.attrs.label}"/>
</td>
<td class="value">
<cc:insertChildren/> --here component with componentId
</td>
</tr>
<tr class="errorMessage">
<td class="label"/>
<td class="value">
<p:message id="error" for="#{cc.attrs.componentId}" />
</td>
</tr>
请参阅下面修改后的必填字段代码。您可以根据您的要求使用#{empty param.onlySave} 作为您想要跳过验证的字段。
<p:inputText value="#{cc.attrs.data.exampleData1}"
required="#{not empty param.onlySave}"/>
<p:inputText value="#{cc.attrs.data.exampleData2}"
required="#{not empty param.onlySave}"/>
<p:inputText value="#{cc.attrs.data.exampleData3}"
required="#{not empty param.onlySave}"/>
<p:commandButton value="Zapisz zmiany"
action="#{cc.attrs.controller.save()}"
update="@form">
<f:param name="onlySave" value="true"/>
</p:commandButton>
我想出了一个解决方案:
JSF 页面
<h:form id="form" prependId="false">
<c:if test="#{param['onlySave'] eq true}">
<c:set value="#{false}" target="#{myBean}" property="required"/>
</c:if>
<p:inputText value="#{myBean.required}"/>
<p:growl id="msgs" showDetail="true" />
<p:inputText id="data1" value="#{myBean.data1}"
required="#{myBean.required}" />
<p:inputText id="data2" value="#{myBean.data2}"
required="#{myBean.required}"/>
<p:inputText id="data3" value="#{myBean.data3}"
required="#{myBean.required}"/>
<p:commandButton value="Zapisz zmiany"
action="#{myBean.save}" />
</h:form>
豆子
@ManagedBean
@ViewScoped
public class MyBean implements Serializable{
private String data1, data2, data3;
private boolean required;
@PostConstruct
public void init(){
required = true;
}
public void save() {
System.out.println(data1+", "+data2+", "+data3);
required = false;
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Info","Saved"));
// FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("onlySave", "false");// FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("onlySave"));
}
// ... Getters & Setters
}
到目前为止,我找到的最佳解决方案是:
//p:label and p:message with property for=someId for each input above
<p:inputText id="someId" value="#{cc.attrs.data.exampleData1}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData2}"
required="#{param['onlySave'] == null}"/>
<p:inputText value="#{cc.attrs.data.exampleData3}"
required="#{param['onlySave'] == null}"/>
<p:commandButton value="save only"
action="#{cc.attrs.controller.save()}"
update="@(.ui-message,.ui-outputlabel)">
<f:param name="onlySave" value="true"/>
</p:commandButton>
<p:commandButton value="accept button"
action="#{cc.attrs.controller.accept()}"
update="@form">
</p:commandButton>
保存按钮仅更新所有错误和标签,因此我能够看到转换器错误等,但我没有丢失输入的 required 样式。在此示例中,我只是丢失了输入边框的红色。
如果您在请求ui红色字段的标签中使用 *,请不要更新。ui-outputlabel