【问题标题】:How to conditionally invoke a4j:commandButton oncomplete script depending on action outcome如何根据操作结果有条件地调用 a4j:commandButton oncomplete 脚本
【发布时间】:2011-07-27 12:38:29
【问题描述】:

我有一个

<a4j:commandButton action="#{myBean.doCalculation}"
                   oncomplete="redirectBrowser()" />

但是,如果myBean.doCalculation() 出现错误,则始终调用oncomplete 属性。如何让它取决于操作方法的结果?

【问题讨论】:

    标签: jsf richfaces ajax4jsf


    【解决方案1】:

    您可以检查 oncomplete 事件中的错误,并在未找到错误时重定向。可以这样实现

    oncomplete="#{facesContext.maximumSeverity == null ? 'redirectBrowser()' : 'doSomethingElse()'}"
    

    【讨论】:

    • a4j:commandButton 和导航确实没有问题——它不是为导航而设计的。一种选择是使用 进行导航。
    【解决方案2】:

    如果您使用的是 JSF 2.0,则可以使用 FacesContext#isValidationFalied() 检查验证是否失败:

    oncomplete="if (#{not facesContext.validationFailed}) redirectBrowser()"
    

    不过,只在 action 方法中执行重定向更干净:

    public String doCalculation() {
        // ...
    
        if (success) {
            return "nextPage.xhtml?faces-redirect=true";
        } else {
            return null;
        }
    }
    

    更简洁的方法是通过Validator 进行验证。这样,当验证失败时,操作方法根本不会被调用。

    【讨论】:

    • 感谢您的回答!这很有帮助。恭敬地不同意一点,在 action 方法中进行重定向不太干净——恕我直言,允许通过返回字符串进行重定向是 Faces 中的一个设计缺陷......
    • 绝对不是设计缺陷。 PRG 是最常用的网页设计模式之一:en.wikipedia.org/wiki/Post/Redirect/Get 然而,使用 POST 表单进行 plain vanilla 从页面 X 到页面 Y 的导航反过来绝对是一个设计缺陷(由开发人员,而不是由 JSF)。另见stackoverflow.com/questions/4317684/…
    • 抱歉,懒惰不是我要找的词。 PRG没有错;这只是一个笨拙的语法是我得到的。返回一个字符串而不是调用一些重定向方法似乎很奇怪。
    【解决方案3】:

    好吧,仅仅寻找 facesContext.maximumSeverity == null 是不够的,可能会有一个警告作为当前最大严重性,它也应该重定向。相反,编写一个方法来查看是否有任何最大严重性的优先级错误...

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2019-05-13
      • 1970-01-01
      • 2014-10-04
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多