Validation 如何验证多个选项卡上共享的实体

Validation 如何验证多个选项卡上共享的实体,validation,jsf,primefaces,tabview,Validation,Jsf,Primefaces,Tabview,我有一个具有许多属性的实体,这些属性应该显示在p:tabView的多个选项卡中。它可能如下所示。 我有一个h:form,它围绕着p:tabView。在选项卡中,每个输入元素都有一条p:message消息 <p:column> <p:outputLabel value="Name" for="name_input" /> </p:column> <p:column> <p:message for="name_input" di

我有一个具有许多属性的实体,这些属性应该显示在p:tabView的多个选项卡中。它可能如下所示。

我有一个h:form,它围绕着p:tabView。在选项卡中,每个输入元素都有一条p:message消息

<p:column>
    <p:outputLabel value="Name" for="name_input" />
</p:column>
<p:column>
    <p:message for="name_input" display="icon" />
</p:column>
<p:column>
    <p:inputText id="name_input" value="#{bean.person.name}">
        <p:ajax /> <!-- put value into backingbean on tabchange -->
        <f:validateRequired />
    </p:inputText>
</p:column>

我发表了以下意见

1)问题:验证仅在已激活的选项卡中执行

  • 如果我切换到编辑模式,当前选项卡没有验证错误,并且我没有更改该选项卡,则会保存我的实体,并忽略其他选项卡上的验证错误

  • 如果切换到编辑模式并导航到有验证错误的选项卡,然后导航到没有验证错误的第一个选项卡,则会显示验证错误(但仅从我访问的那些选项卡显示)

  • (我希望这是可以理解的,至少有一点)如果我在p:tabView中设置dynamic=true/false和cache=false,这没有什么区别

2)问题:选项卡更改时没有消息图标

  • 如果我切换到编辑模式并单击每个选项卡,以便识别每个验证错误(如场景b),我会得到一条正确的验证消息(图标),并且p:inputText显示为红色边框。看来一切都很好。但是,如果我导航到另一个有验证错误的选项卡,则不会显示消息图标,只有红色边框围绕着特定的p:inputText。据我猜测,JSF生命周期是在选项卡更改时执行的,但没有进行任何验证,因此对于这个生命周期往返,一切正常,消息图标消失(另一方面,为什么红色边框没有消失,这对我来说是个谜…)
3)问题:选项卡中没有视觉提示

  • 对于用户体验,我非常希望有一个视觉提示(即标签标题上的红色背景),以便用户知道问题发生在哪里
我读过,但向导(它不是一个“向导”任务,它只是一个大实体的编辑)和使用javascrip和css自己动手(主要问题是我在其他情况下经常使用的法人身份)对我来说都不是一个好的选择

有人对我的任何问题有解决方案/提示吗


我使用的是JSF2.2,Primefaces 5.3。

好的,我的一位同事给出了答案

首先,我的前两个问题消失得无影无踪。使用
中的属性
dynamic=“false”
cache=“false”
,这可以根据需要工作(我不知道当时测试了什么)

以及选项卡中的视觉提示。有一个
,可用于显示选项卡标题和其他消息。
组件加倍,首先在输入组件的列中,其次在标题方面。有了一点CSS,你可以随意调整标题中的图标

<p:tabView dynamic="false" cache="false">
    <f:facet name="title">
        Address
        <p:message for="name_input" display="icon" />
    </f:facet>
    ...
    <p:panelGrid>
        <p:row>
            <p:column>
                <p:outputLabel value="Name" for="name_input" />
            </p:column>
            <p:column>
                <p:message for="name_input" display="icon" />
            </p:column>
            <p:column>
                <p:inputText id="name_input" value="#{bean.person.name}">
                    <p:ajax />
                    <f:validateRequired />
                </p:inputText>
            </p:column>
        </p:row>
        ....
    </p:panelGrid>
</p:tabView>

地址
...
....

两件事:-请每个问题发布一个问题。-总是发布(每个问题)@Kukeltje:对不起,我下次会记得:-)