在action属性中使用EL条件运算符是否可行?

29

三元运算符在许多属性中起作用,如“rendered”、“value”和其他属性。

但它在action(动作)中不起作用?或者是我用错了吗?

<h:commandLink action="#{true ? bean.methodTrue() : bean.methodFalse()}"/>

错误:javax.el.ELException:不是有效的方法表达式

(我使用PrimeFaces Ajax action属性时意识到这一点)


1
根据这个,EL条件方法表达式不可能实现。 - Fallup
谢谢,希望这个问题在未来的更新中得到解决。 - djmj
1个回答

53

这不受支持。 action 属性应该是一个 MethodExpression,但条件运算符将其变成了 ValueExpression 语法。我认为这永远不会支持 EL 中的 MethodExpression

你基本上有两个选择:

  1. 创建一个单独的动作方法来委托工作。

<h:commandButton ... action="#{bean.method}" />

使用

public String method() {
    return condition ? methodTrue() : methodFalse();
}
如果必要的话,可以通过 #{bean.method(condition)} 将其作为方法参数传递。
或者,有条件地渲染两个按钮。
<h:commandButton ... action="#{bean.methodTrue}" rendered="#{bean.condition}" />
<h:commandButton ... action="#{bean.methodFalse}" rendered="#{not bean.conditon}" />

1
@Alex:最适合您模型的方式。然而,第二种方法有一个额外的要求,即必须在请求中保留条件,最好通过将bean放置在视图范围内来实现,否则您将遇到https://dev59.com/IXI95IYBdhLWcg3w2h96中描述的问题#5。 - BalusC
@BalusC 的视图作用域对我的需求来说非常好,而且它完美地运行。再次感谢您。以后如果还需要,可以叫我 Alexander(不知道为什么,但是请不要叫我 Alex)。 :) - alexander
同样适用于outputLink吗? - Michael Miner
@MichaelMiner:输出链接首先没有任何方法表达式属性。 - BalusC
第二个选项是最好的! - TiyebM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接