【问题标题】:text fields are not getting updated after validation fails验证失败后文本字段未更新
【发布时间】:2014-05-08 15:01:15
【问题描述】:

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

【问题讨论】:

  • 我在上面粘贴了我的代码
  • 您指的是哪些文本字段?您的代码中没有文本字段。请花一些精力来格式化您的代码,使其更易于阅读。现在只是一堆乱七八糟的文字

标签: jsf-2 richfaces ajax4jsf


【解决方案1】:

问题

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


解决

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

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

上面的sn-p只有在当前请求周期被标记为失败的情况下才会执行,然后继续用id="textField1"清除textfield的本地值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多