gpt4 book ai didi

validation - 为什么 behave different than other validators?

转载 作者:行者123 更新时间:2023-12-04 00:16:39 25 4
gpt4 key购买 nike

我用 OmniFaces' <o:validateAll>验证器来验证一些输入组件。只要我不把它放到 RichFaces <rich:tabPanel> 中,这就能正常工作.当我这样做并将字段留空时,验证失败(如预期),但无论验证失败如何,事件选项卡都会更改。我尝试过的其他验证器阻止了 tabPanel从切换到另一个选项卡,每当验证失败。

这可能是什么原因?

我目前在 Wildfly 9.0.2 上使用 OmniFaces 2.1 和 RichFaces 4.5.17.Final 和 Mojarra 2.2.12。

这是重现问题的 XHTML 代码:

<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:o="http://omnifaces.org/ui"
xmlns:rich="http://richfaces.org/rich">

<h:form id="form">

<rich:messages />

<rich:tabPanel id="tabPanel">

<rich:tab id="tab1" header="Tab 1">
<h:inputText id="myDouble" value="#{someDoubleVal}">
<f:validateDoubleRange minimum="1.0" maximum="2.0"/>
</h:inputText>
<o:validateAll id="allValid" components="myDouble" message="Missing value!" />
</rich:tab>

<rich:tab id="tab2" header="Tab 2">
Just another tab to switch.
</rich:tab>

</rich:tabPanel>

</h:form>

</ui:composition>

输入 1.0 和 2.0 以外的值,然后尝试切换到选项卡 2 以查看由 <f:validateDoubleRange> 触发的预期行为:显示人脸消息并且第一个选项卡仍处于事件状态。

将输入留空并尝试切换到选项卡 2 以查看 <o:validateAll> 的行为: 验证似乎失败(显示人脸消息),但选项卡 2 已激活。

更新:所描述的行为适用于 switchType="ajax" (默认)以及 switchType="server" .在这两种情况下,选项卡面板都执行包含输入的提交,因此从用户的角度来看,选项卡开关似乎与 <h:commandButton> 相同。提交(技术上可能存在差异,我不知道选项卡面板的实现细节)。

如果我通过常规 <h:commandButton> 执行选项卡切换与 <f:setPropertyActionListener> , <o:validateAll>行为方式与其他验证器相同,即由于验证错误,不执行选项卡切换。
<rich:tabPanel id="tabPanel" activeItem="#{bb.activeTab}">
...
<rich:tab id="tab1" name="tab1" header="Tab 1">
...
<h:commandButton value="submit">
<f:setPropertyActionListener value="tab2" target="#{bb.activeTab}" />
</h:commandButton>
...
</rich:tab>
</rich:tabPanel>

注:这只是一个显示有问题行为的简约示例。在我的实际代码中,我不仅仅有一个由 <o:validateAll> 验证的组件。我确实将输入值与支持 bean 相关联。观察到的行为完全相同。

最佳答案

问题是双重的。

第一个问题是,<o:validateAll>没有明确调用 context.renderResponse() 当验证失败并将此作业留给 JSF 时,JSF 将在验证阶段隐式调用它,当在 <o:validateAll> 之后发现至少一个输入组件无效时已运行,或者在后续更新模型值阶段期间运行。

第二个问题是,<rich:tabPanel>选项卡切换事件排队等待更新模型值阶段而不是调用应用程序阶段。我不知道为什么 RichFaces 人这样设计它,但结果是即使在更新模型值阶段发现验证失败,选项卡切换事件也会被触发。

搬家时<o:validateAll>在至少一个关联的输入组件之前,JSF 将隐式调用 context.renderResponse()在验证阶段,因此完全跳过更新模型值阶段,因此排队 <rich:tabPanel>选项卡切换事件将没有机会被调用。

我已按照 issue 322 在 OmniFaces 2.6-SNAPSHOT 中修复它.使用 OmniFaces 2.6 或更新版本时,位置不重要 <o:validateAll>被放置在树中以实现 <rich:tabPanel> 的期望行为不调用选项卡切换事件。

关于validation - 为什么 <o :validateAll> behave different than other validators?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39960858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com