action method is not called 请参考这个问题 - 我的一个UICommand组件是有条件呈现的,在链接问题的答案中说 - 第5点 - 如果组件或其任何父母呈现或禁用属性是假的 - 那么动作方法不会被调用?如果是这样 - 我如何实现相同的功能?有工作吗?还是一招?或任何其他方法?
谢谢!
答案 0 :(得分:3)
就此而言,您希望在后续请求中保留负责rendered
条件的属性。这个问题有几种解决方案:
将bean放入会话范围。这很简单,但很痛。这对用户体验有害,因为更改将反映在用户在同一会话中打开的所有选项卡/窗口中。
使用<h:inputHidden>
转移财产。理论上很容易,但在实践中它也会受到伤害。只要在同一表单中的任何其他输入中发生验证/转换错误,该值就会丢失。这是JSF处理隐藏输入元素的一个奇怪之处。解决方法是使用<h:inputHidden binding="#{bean.hidden}">
并在bean中执行hidden.getValue()
和hidden.setValue()
。
如果您使用的是<h:commandLink>
而不是<h:commandButton>
,那么您可以使用<f:param>
转移该媒体资源。它将作为请求参数提供,您可以在bean的(post)构造函数中检查它。
使用Tomahawk's <t:saveState>
。迄今为止的完美解决方案。这将在后续请求中保留值(甚至是完整的bean)。
如果你已经使用JSF 2.0,那么@ViewScoped
就可以解决这个问题。它的行为类似于<t:saveState>
。
答案 1 :(得分:0)
诀窍是,当运行动作然后在action方法中将条件更改为false时,将'rendered'计算为true。
假设您有一个基于bean中名为'editing'的布尔值的链接呈现。然后你的行动将是这样的:
public String myAction() {
// whatever you want your action to do
editing = false;
}
编辑:这假定bean是会话范围的,或者是在请求之间传播的布尔值。
答案 2 :(得分:0)
在我的情况下,Javascript来救援,这意味着,无论要有条件地显示什么,将它们放在HTML部分中,并且在所需事件发生之前不要显示它们display: none
。
HTML部分可以根据需要使用任何JSF标记(包括CommandButtons),并且可以正常工作(调用动作方法和内容)。