普遍跳过所需输入的验证参数

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