【问题标题】:includeViewParams does not set values after validationincludeViewParams 验证后不设置值
【发布时间】:2014-03-12 19:14:46
【问题描述】:

JSF 2.

具有经过验证的单个输入的简单表单。使用 o:form 尝试解决问题。

<f:view>
    <f:metadata>
        <f:viewParam name="info2" value="#{myClass.info2}" />
        <f:viewParam name="info1" value="#{myClass.info1}" />
        <f:event listener="#{myClass.init(}" type="preRenderView" />
    </f:metadata>
    <o:form includeViewParams="true">
        <h:outputText value="Enter some info for #{myClass.info1}" />
        <h:inputText id="input" value="#{myClass.info3}"
        validator="myValidator" />
        <br />
        <h:commandButton action="#{myClass.action()}" value="Enter some info" />
        <br />
        <h:message for="input" />
        <br />
        <h:outputText value="#{myClass.info2}" />
    </o:form>
</f:view>

使用此 URL 调用

http://localhost:8080/test/test.xhtml?info1=hello&info2=there

当我在输入字段中输入一个值并且验证失败时,页面返回 相同的 URL,但 myClass.info1 和 myClass.info2 都设置为 null。太好了 URL 被保留,但如果这些参数没有在 豆子。

为什么会这样,我该如何解决?

【问题讨论】:

  • 考虑使用 f:ajax 作为 commandButton 和 o:viewParam 而不是 f:viewParam
  • 我意识到这篇文章是对stackoverflow.com/questions/16187049/… 问题的更好呈现。我现在可以撤回问题吗?

标签: jsf-2 omnifaces


【解决方案1】:

很遗憾,这是意料之中的行为。如果验证阶段失败,则不会执行更新模型值阶段。这不仅适用于表单的输入字段,同样适用于同一个请求中涉及的视图参数!显然,您的 bean 是请求范围的,然后在初始请求期间设置的视图参数确实会丢失。

最好的办法是将托管 bean 改为 @ViewScoped 并使用 &lt;o:viewParam&gt; 仅在初始 GET 请求期间设置视图参数。当Faces#isPostback() 返回true 时,您可能只需要更改init() 方法即可跳过该作业。

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 2021-12-17
    • 1970-01-01
    • 2017-08-17
    • 2022-01-09
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多