使用 ajax 对 selectOneMenu 进行更改时省略验证
Omit validation when making change on selectOneMenu with ajax
我有一个 selectOneMenu 表单,带有 ajax 以在触发时更新单独的组件。此菜单还使用验证。菜单中的第一项为空,验证可确保如果此项为空则无法提交表单。但是,我确实希望用户能够 select 空项目,并将我的支持 bean 中该项目的值设置为空。但是,当用户 select 设置为 null 项时,设置不会发生,因为首先发生验证失败并抛出异常,阻止在我的支持 bean 中将值设置为 null。
这是我的代码
<h:form>
...
<p:selectOneMenu value="#{myBean.container}">
<f:selectItem itemLabel="Select One" itemValue=#{null} />
<f:selectItems value="#{myBean.getContainerItems()}" />
<p:ajax event="change" update="containerNumSection" />
<f:validateRequired />
</p:selectOneMenu>
...
</h:form>
当用户 select 为 null 项并保持验证时,有什么方法可以将我的支持 bean 中的值设置为 null?
我发现了一种使用自定义验证方法的变通方法,该方法能够区分更改 selectOneMany 或按下提交按钮的情况:
<h:form>
<p:selectOneMenu id="select" value="#{myBean.stringVal}"
validator="#{myBean.validateSelection}">
<f:selectItem itemLabel="nothing" itemValue="#{null}" />
<f:selectItem itemLabel="a" itemValue="a" />
<f:selectItem itemLabel="b" itemValue="b" />
<p:ajax update="@form" process="@this"/>
</p:selectOneMenu>
<p:commandButton value="submit" update="@form" process="@form">
<f:param name="selectionRequired" value="true"/>
</p:commandButton>
<h:message for="select" />
<h:outputText value="#{myBean.stringVal}" />
</h:form>
如果用户按下提交按钮,名为 "selectionRequired" 的请求参数将设置为 "true"。如果是这种情况,验证方法委托给 javax.faces.validator.RequiredValidator.validate()
方法,否则它什么都不做。
MyBean.validateSelection:
public void validateSelection(FacesContext context, UIComponent component, Object value) {
String selectionRequired = FacesContext.getCurrentInstance().getExternalContext()
.getRequestParameterMap()
.get("selectionRequired");
if (Boolean.valueOf(selectionRequired)) {
new RequiredValidator().validate(context, component, value);
}
}
我必须启用 javax.faces.VALIDATE_EMPTY_FIELDS
才能使其工作,否则在选择 #{null}
时根本不会调用 validateSelection
方法。
web.xml:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>true</param-value>
</context-param>
我有一个 selectOneMenu 表单,带有 ajax 以在触发时更新单独的组件。此菜单还使用验证。菜单中的第一项为空,验证可确保如果此项为空则无法提交表单。但是,我确实希望用户能够 select 空项目,并将我的支持 bean 中该项目的值设置为空。但是,当用户 select 设置为 null 项时,设置不会发生,因为首先发生验证失败并抛出异常,阻止在我的支持 bean 中将值设置为 null。
这是我的代码
<h:form>
...
<p:selectOneMenu value="#{myBean.container}">
<f:selectItem itemLabel="Select One" itemValue=#{null} />
<f:selectItems value="#{myBean.getContainerItems()}" />
<p:ajax event="change" update="containerNumSection" />
<f:validateRequired />
</p:selectOneMenu>
...
</h:form>
当用户 select 为 null 项并保持验证时,有什么方法可以将我的支持 bean 中的值设置为 null?
我发现了一种使用自定义验证方法的变通方法,该方法能够区分更改 selectOneMany 或按下提交按钮的情况:
<h:form>
<p:selectOneMenu id="select" value="#{myBean.stringVal}"
validator="#{myBean.validateSelection}">
<f:selectItem itemLabel="nothing" itemValue="#{null}" />
<f:selectItem itemLabel="a" itemValue="a" />
<f:selectItem itemLabel="b" itemValue="b" />
<p:ajax update="@form" process="@this"/>
</p:selectOneMenu>
<p:commandButton value="submit" update="@form" process="@form">
<f:param name="selectionRequired" value="true"/>
</p:commandButton>
<h:message for="select" />
<h:outputText value="#{myBean.stringVal}" />
</h:form>
如果用户按下提交按钮,名为 "selectionRequired" 的请求参数将设置为 "true"。如果是这种情况,验证方法委托给 javax.faces.validator.RequiredValidator.validate()
方法,否则它什么都不做。
MyBean.validateSelection:
public void validateSelection(FacesContext context, UIComponent component, Object value) {
String selectionRequired = FacesContext.getCurrentInstance().getExternalContext()
.getRequestParameterMap()
.get("selectionRequired");
if (Boolean.valueOf(selectionRequired)) {
new RequiredValidator().validate(context, component, value);
}
}
我必须启用 javax.faces.VALIDATE_EMPTY_FIELDS
才能使其工作,否则在选择 #{null}
时根本不会调用 validateSelection
方法。
web.xml:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>true</param-value>
</context-param>