includeViewParams在验证后不设置值

时间:2014-03-12 19:14:47

标签: jsf-2 omnifaces

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>

使用此网址

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

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

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

1 个答案:

答案 0 :(得分:1)

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

您最好的选择是将托管bean设为@ViewScoped,而使用<o:viewParam>代替仅在初始GET请求期间设置视图参数。 init()返回Faces#isPostback()时,您可能只需要更改true方法即可跳过作业。