【问题标题】:Required flag on f:viewParam doesn't prevent preRenderView to be calledf:viewParam 上的必需标志不会阻止调用 preRenderView
【发布时间】:2014-02-11 00:49:09
【问题描述】:

我的一些 viewParams 是强制性的,当它们丢失时会显示 FacesMessage。但是系统事件 preRenderView 是在搜索参数为空的情况下执行的,因此返回了默认的数据结果。有没有办法阻止 preRenderView 注册的方法在违反所需属性时执行?

【问题讨论】:

    标签: jsf-2 viewparams


    【解决方案1】:

    &lt;f:event type="preRenderView"&gt; 在此构造中本质上是一种破解/解决方法。正如它的名字所说,确实 always 在渲染响应阶段之前调用,无论类型请求(回发与否)和验证结果(失败与否)。在这个相关问题中也对此进行了详细阐述:What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for? 这包含以下 sn-p 应该可以进一步帮助您:

    public void init() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
            // ...
        }
    }
    

    用所需的逻辑代替// ...

    在 JSF 2.2 中,可以使用&lt;f:viewAction&gt; 风格的标准解决方案,在上述相关问题中也进行了演示。

    【讨论】:

      【解决方案2】:

      我还没有查看代码,但是从 docs 开始,preRenderView 在构造视图中的 anything 之前开始。所以应用程序甚至不知道有一个要验证的视图参数。

      您可能需要在事件方法中检查所需的参数使用 JSF-2.2 的新 f:viewAction,这似乎是您真正想要的。

      如果您可以添加/已经在使用 Omnifaces,则有 InvokeActionEventListener,它在分配了 &lt;f:viewParam&gt;s 之后运行:

      <f:event listener="#{bean.myListener()}" type="postInvokeAction" />
      

      【讨论】:

        猜你喜欢
        • 2016-05-16
        • 2020-06-20
        • 2014-02-08
        • 1970-01-01
        • 2019-01-19
        • 2018-07-19
        • 2016-03-31
        • 1970-01-01
        • 2021-07-24
        相关资源
        最近更新 更多