验证失败后,文本字段不会更新

时间:2014-03-28 23:23:35

标签: jsf-2 richfaces ajax4jsf

我在JSF验证后遇到问题

场景 - 我在表单上有2个下拉列表和2个输入字段。在选择第一个下拉列表时,将填充第二个,并且2个文本字段的值也取决于第一个下拉选择。

1)因此,当我从第一个下拉列表中选择一些值时,第二个下拉列表中的文本字段将填充适当的值。 2)当我点击提交按钮而不选择第二个下拉列表中的值时,它会按预期显示验证消息。 3)现在我在验证错误/失败后更改了第一次下拉的值。文本字段中的值未按要求更改(表示文本字段值仍显示旧值),但第二个下拉值正在按预期更改。

注意: - 问题仅在验证失败后才会出现。

<span class="col1 smallRightPadding marginBtmAdDiag">
<rich:select defaultLabel="Select bldng" enableManualInput="true"
id="search_bldng" 
value="#{testManagedBean.bldng.bldngID}"
required="true" requiredMessage="#{testHome.selectBldng}">
<f:selectItemsvalue="#{testManagedBean.lstBldng}" var="bldngVar"
itemValue="#{bldngVar.bldngID}" itemLabel="#{bldngVar.bldngCode}">
</f:selectItems>
<a4j:ajax execute="@this" event="selectitem"
listener="#{testManagedBean.populateFloor}" 
render="search_floor,hidSelBldng,hidSelFloor,hidSelbldngID" />
</rich:select>
<h:inputHidden id="hidSelBldng" value="#{testManagedBean.bldng.bldngCode}" />
<h:inputHidden id="hidSelbldngID" value="#{testManagedBean.bldng.bldngID}" />
</span>

<rich:select defaultLabel="Select Floor" enableManualInput="true"
id="search_floor"
  value="#{testManagedBean.floor.floorID}"
 required="true"
requiredMessage="#{testHome.selectFloor}">
<f:selectItems value="#{testManagedBean.floorLst}"
var="flr" itemValue="#{flr.floorID}"
itemLabel="#{flr.floorName}">
</f:selectItems>
</rich:select>

<h:commandButton id="goButtonId" value="#{testHome.goButton}" styleClass="saveButton">
<a4j:ajax event="click" execute="@form" oncomplete="drawLayerFromBtn();" 
 listener="#{testManagedBean.viewReport}" 
render="tableId,hidSelFloor"/>
</h:commandButton>

   

1 个答案:

答案 0 :(得分:0)

问题

在验证错误后重置输入字段上的本地值是经典的问题。验证失败后,JSF不会重置先前验证错误中捕获的字段的值,因此您仍然看到旧值的原因


解决

您基本上需要自己重置这些(缺失的)文本字段的值。在方便的地方,也许在populateFloor

   if(ctxt.isValidationFailed()){
       UIInput textField1 = (UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("theTextFieldId")
       textField1.resetValue();
    }

只有当前请求周期被标记为失败时,才会执行上面的代码段,然后使用id="textField1"

继续清除文本字段的本地值