JSF 直通单选按钮选择在表单验证错误时重置
JSF passthrough radio button selection resets on form validation errors
我有一个 JSF 2.2 表单,由一个输入文本字段和一对内联显示的单选按钮组成。考虑到 JSF 2.2 中单选按钮组的已知限制,我正在使用 BalusC 在 this blog post 中概述的技术。我们无法升级到 JSF 2.3,因为这是一个 Weblogic 应用程序,我们目前锁定在 Weblogic 12.2 (JavaEE 7)。
虽然此技术在提交有效表单时工作正常,但问题是如果提交了无效表单,则用户的单选按钮选择将丢失,并重置为最后一个有效值(或初始值) .
这是我如何定义单选按钮对的示例,使用 h:inputHidden
元素并将其 binding
属性与各个单选按钮的 name
属性链接(为他们的组 ID)。
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
<div class="form-group">
<h:outputLabel for="heightInput"
value="Height"
styleClass="col-xs-6" />
<div class="col-xs-6">
<h:inputText id="heightInput"
value="#{modelBean.height}"
required="true" />
</div>
<div class="col-xs-12">
<div class="radio-inline">
<h:outputLabel for="heightCentimeters">
<input type="radio"
jsf:id="heightCentimeters"
pt:name="#{hiddenHeightUnitSelection.clientId}"
value="CENTIMETERS"
pt:checked="#{modelBean.heightUnit eq 'CENTIMETERS' ? 'checked' : null}" />
Centimeters
</h:outputLabel>
</div>
<div class="radio-inline">
<h:outputLabel for="heightInches">
<input type="radio"
jsf:id="heightInches"
pt:name="#{hiddenHeightUnitSelection.clientId}"
value="INCHES"
pt:checked="#{modelBean.heightUnit eq 'INCHES' ? 'checked' : null}" />
Inches
</h:outputLabel>
</div>
<h:inputHidden id="heightUnitSelection"
binding="#{hiddenHeightUnitSelection}"
value="#{modelBean.heightUnit}"
rendered="#{facesContext.currentPhaseId.ordinal ne 6}" />
</div>
</div>
</ui:composition>
如果提交的表单无效,如何保留用户的单选按钮选择?该模型永远不会随着他们的选择而更新。即使存在验证错误,其他表单元素也会在提交表单时保留它们的值。我怎样才能让我的单选按钮组表现得相似?
实际上,checked
属性正在直接比较模型值。
pt:checked="#{modelBean.heightUnit eq 'CENTIMETERS' ? 'checked' : null}"
模型值在UPDATE_MODEL_VALUES
阶段更新,但在PROCESS_VALIDATIONS
阶段遇到验证错误时不会执行。
基本上,您想检查提交的值而不是模型值。 UIInput#getValue()
背后的逻辑已经涵盖了这一点。在您的特定情况下,您想与 <h:inputHidden>
的值进行比较。
pt:checked="#{hiddenHeightUnitSelection.value eq 'CENTIMETERS' ? 'checked' : null}"
您问题中链接的博客文章已同时更新。
我有一个 JSF 2.2 表单,由一个输入文本字段和一对内联显示的单选按钮组成。考虑到 JSF 2.2 中单选按钮组的已知限制,我正在使用 BalusC 在 this blog post 中概述的技术。我们无法升级到 JSF 2.3,因为这是一个 Weblogic 应用程序,我们目前锁定在 Weblogic 12.2 (JavaEE 7)。
虽然此技术在提交有效表单时工作正常,但问题是如果提交了无效表单,则用户的单选按钮选择将丢失,并重置为最后一个有效值(或初始值) .
这是我如何定义单选按钮对的示例,使用 h:inputHidden
元素并将其 binding
属性与各个单选按钮的 name
属性链接(为他们的组 ID)。
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
<div class="form-group">
<h:outputLabel for="heightInput"
value="Height"
styleClass="col-xs-6" />
<div class="col-xs-6">
<h:inputText id="heightInput"
value="#{modelBean.height}"
required="true" />
</div>
<div class="col-xs-12">
<div class="radio-inline">
<h:outputLabel for="heightCentimeters">
<input type="radio"
jsf:id="heightCentimeters"
pt:name="#{hiddenHeightUnitSelection.clientId}"
value="CENTIMETERS"
pt:checked="#{modelBean.heightUnit eq 'CENTIMETERS' ? 'checked' : null}" />
Centimeters
</h:outputLabel>
</div>
<div class="radio-inline">
<h:outputLabel for="heightInches">
<input type="radio"
jsf:id="heightInches"
pt:name="#{hiddenHeightUnitSelection.clientId}"
value="INCHES"
pt:checked="#{modelBean.heightUnit eq 'INCHES' ? 'checked' : null}" />
Inches
</h:outputLabel>
</div>
<h:inputHidden id="heightUnitSelection"
binding="#{hiddenHeightUnitSelection}"
value="#{modelBean.heightUnit}"
rendered="#{facesContext.currentPhaseId.ordinal ne 6}" />
</div>
</div>
</ui:composition>
如果提交的表单无效,如何保留用户的单选按钮选择?该模型永远不会随着他们的选择而更新。即使存在验证错误,其他表单元素也会在提交表单时保留它们的值。我怎样才能让我的单选按钮组表现得相似?
实际上,checked
属性正在直接比较模型值。
pt:checked="#{modelBean.heightUnit eq 'CENTIMETERS' ? 'checked' : null}"
模型值在UPDATE_MODEL_VALUES
阶段更新,但在PROCESS_VALIDATIONS
阶段遇到验证错误时不会执行。
基本上,您想检查提交的值而不是模型值。 UIInput#getValue()
背后的逻辑已经涵盖了这一点。在您的特定情况下,您想与 <h:inputHidden>
的值进行比较。
pt:checked="#{hiddenHeightUnitSelection.value eq 'CENTIMETERS' ? 'checked' : null}"
您问题中链接的博客文章已同时更新。