【问题标题】:Button with Immediate="true" clears currently displayed validation messages带有 Immediate="true" 的按钮清除当前显示的验证消息
【发布时间】:2013-01-21 15:42:25
【问题描述】:

我有一个命令按钮,可以通过字段帮助重新显示页面。 这需要在没有 JavaScript 的情况下工作。 我不想触发验证,所以我添加了 immediate = true。 这很好用,但是页面上的任何验证消息都会消失,而我希望它们保留在那里。

<h:commandButton rendered="#{cc.attrs.helpId!= null}" styleClass="helpButton" value="?" type="submit" action="#{visibleHelp.toggle(cc.clientId)}" immediate="true" />

...

<h:panelGroup rendered="#{visibleHelp[cc.clientId] != null}" id="#{cc.attrs.name}_helpText" styleClass="help-text">
    <h:outputText value="#{help[cc.attrs.helpId]}"/>
</h:panelGroup>

...

是这样吗,还是我错过了什么?

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    这是预期的行为。面孔消息是请求范围的。提交表单会创建一个新请求。使用immediate="true",没有该属性的输入组件将不会被验证,因此不会生成人脸消息。在同步(非 ajax)回发中,初始消息会因为整个页面重新加载而“消失”。

    只需通过 ajax 提交,这样页面就不会完全重新加载。

    <h:panelGroup id="helpButton">
        <h:commandButton rendered="#{cc.attrs.helpId!= null}" styleClass="helpButton" 
            value="?" action="#{visibleHelp.toggle(cc.clientId)}" immediate="true">
            <f:ajax render="helpButton helpSection" />
        </h:commandButton>
    </h:panelGroup>
    
    ...
    
    <h:panelGroup id="helpSection">
        <h:panelGroup rendered="#{visibleHelp[cc.clientId] != null}" 
            id="#{cc.attrs.name}_helpText" styleClass="help-text">
            <h:outputText value="#{help[cc.attrs.helpId]}"/>
       </h:panelGroup>
    </h:panelGroup>
    

    确实,这仍然涉及 JavaScript,但没有其他可行的解决方案,或者您必须删除 immediate="true" 以便为这些输入组件重新执行验证。

    【讨论】:

    • 谢谢,我已经完成了 ajax 位,但我们的客户正在使用渐进增强,所以我也需要一个无脚本选项。
    • 我认为客户将不得不忍受它,大多数用户都有javascript。您断言“没有其他可行的解决方案”有助于我的立场 - 再次感谢。
    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多