【发布时间】:2013-02-28 15:49:47
【问题描述】:
我有以下代码:
<h:form>
<h:inputText id="inputField" value="#{bean.myProperty}">
<f:validateLongRange
minimum="#{bean.minimum}"
maximum="#{bean.maximum}"/>
</h:inputText>
<h:commandButton id="submit" value="Submit" >
<f:ajax execute="inputField" render="outputField errors" />
</h:commandButton>
<h:outputText id="outputField" value="#{bean.myPropertyFormatted}"/>
<h:message id="errors" for="inputField"/>
</h:form>
当 inputText 验证失败时,我想从用户那里删除/隐藏 outputText。最优雅且面向未来的重构方式是什么?
我尝试在 outputText 元素上设置属性 rendered="#{!facesContext.validationFailed}",但这仅确定 outputText 元素是否被重新渲染,而不是保持旧文本不变。但是,当 validateLongRange 验证失败时,我想完全删除/隐藏用户的 outputText,因为用户将看到验证错误消息,并且对基于先前有效输入的旧输出消息不感兴趣仍然是存储在 bean 中的值。
【问题讨论】:
-
我不明白为什么
rendered不能胜任这项工作。如果其中的 EL 返回 falseoutputText元素将不会被渲染,这意味着您将根本没有该元素的 HTML 在浏览器中。这不是你需要的吗? -
@partlov:是的,这就是我需要的,但这不是我看到的行为。相反,当我遇到验证错误时,
outputText将保持不变。我希望它消失。如果我反转 EL 输出(没有“!”),就更容易看到发生了什么。对于rendered="#{facesContext.validationFailed}",我没有在outputText上获得任何有效值的更新,但是一旦我给出一个无效值,我就会得到更新,这会导致验证错误。即在验证错误时,我看到在输入无效值之前输入的最后一个有效值。 -
@partlov:我的代码没有像您预期的那样运行的原因可能与 f:ajax 元素的使用有关吗?另请参阅下面的答案。
标签: validation jsf