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

时间:2015-07-08 12:19:58

标签: jsf jsf-2 primefaces

如何制作一些可以跳过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>

这个解决方案很好,因为我可以在每个页面中将此参数添加到按钮并跳过验证,但是当我的保存按钮没有进行任何重定向时,如果在save方法中失败了一些java验证,我只是添加了一些没有重定向的消息然后我从输入中丢失了所有必需的样式。

在验证失败时,是否有可能在保存方法中将onlySave参数设置为null,或者可能是更好的解决方案?

编辑:Balus回答很棒,但是通过bean验证:

@Pattern(regexp = "^([^0-9]*)$", message = "only non numbers")
String field;

它处理bean以外的所有数据。最好的只是忽略必需的字段属性,而不是验证等。

EDIT2:

<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>

3 个答案:

答案 0 :(得分:0)

请参阅以下修改后的必填字段代码。您可以根据需要使用#{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>

答案 1 :(得分:0)

到目前为止,我发现的最佳解决方案是:

//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>

保存按钮只更新所有错误和标签,因此我能够看到转换器错误等,但我没有丢失输入所需的样式。在这个例子中,我只是丢失了输入边框的红色。

如果您在必填字段的标签中使用*,请不要更新.ui-outputlabel

答案 2 :(得分:-1)

我想出了一个解决方案:
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
}