如何调用有条件呈现的UICommand组件的动作方法?

时间:2010-06-15 12:36:22

标签: jsf

action method is not called 请参考这个问题 - 我的一个UICommand组件是有条件呈现的,在链接问题的答案中说 - 第5点 - 如果组件或其任何父母呈现或禁用属性是假的 - 那么动作方法不会被调用?如果是这样 - 我如何实现相同的功能?有工作吗?还是一招?或任何其他方法?

谢谢!

3 个答案:

答案 0 :(得分:3)

就此而言,您希望在后续请求中保留负责rendered条件的属性。这个问题有几种解决方案:

  1. 将bean放入会话范围。这很简单,但很痛。这对用户体验有害,因为更改将反映在用户在同一会话中打开的所有选项卡/窗口中。

  2. 使用<h:inputHidden>转移财产。理论上很容易,但在实践中它也会受到伤害。只要在同一表单中的任何其他输入中发生验证/转换错误,该值就会丢失。这是JSF处理隐藏输入元素的一个奇怪之处。解决方法是使用<h:inputHidden binding="#{bean.hidden}">并在bean中执行hidden.getValue()hidden.setValue()

  3. 如果您使用的是<h:commandLink>而不是<h:commandButton>,那么您可以使用<f:param>转移该媒体资源。它将作为请求参数提供,您可以在bean的(post)构造函数中检查它。

  4. 使用Tomahawk's <t:saveState>。迄今为止的完美解决方案。这将在后续请求中保留值(甚至是完整的bean)。

  5. 如果你已经使用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),并且可以正常工作(调用动作方法和内容)。