【问题标题】:JSF component no longer rendered, but FacesMessage remainsJSF 组件不再呈现,但 FacesMessage 仍然存在
【发布时间】:2013-03-30 21:15:22
【问题描述】:

情况如下:

  1. 我有一个组件,它的值是我的 ViewScoped bean 的一个属性,它会生成一个 FacesMessage,它会在首次提交表单时出现一些错误
  2. 在随后的用户操作中,单击 h:commandlink,它使用 f:ajax,并且它的 actionlistener 将组件设置为不再呈现
  3. 收到响应后,组件不再呈现(如预期的那样),但它的 FacesMessage 仍然保留并显示

我正在使用 Mojarra JSF 2.1 和 IceFaces 3.0 - 尽管仅使用标准 JSF 组件才能看到此示例和有问题的行为。这是一个演示该行为的小示例:

test.xhtml

<h:form id="testform">
    <h:message for="tv"/>
    <h:inputText id="tv" value="#{testBean.testVal}" rendered="#{testBean.testValRendered}" required="true" />
    <h:commandButton value="Submit"/>
            <h:commandLink actionListener="#{testBean.toggleTestVal}" value="Toggle input">
        <f:ajax execute="@this" render="@form"/>
    </h:commandLink>
</h:form>

Bean 代码

@ViewScoped
@ManagedBean(name = "testBean") 
public class TestBean {

    private String testVal;
    private boolean testValRendered;

    public TestBean() {
        testValRendered = true;
    }

    public String getTestVal() {
        return testVal;
    }

    public void setTestVal(String testVal) {
        this.testVal = testVal;
    }

    public boolean isTestValRendered() {
        return testValRendered;
    }

    public void setTestValRendered(boolean testValRendered) {
        this.testValRendered = testValRendered;
    }

    public void toggleTestVal(ActionEvent ae) {
        testValRendered = !testValRendered;
    }
}

如果我更改 h:commandLink 使其不使用 f:ajax,并在其上设置 immediate='true',则消息将被正确删除。虽然这在某些情况下可能有效,但我想了解为什么使用 f:ajax 来呈现我在示例中的内容不起作用。谢谢。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    输入组件在其渲染条件被切换之前被提交、处理和验证。 &lt;h:message&gt; 不知道关联的输入组件未呈现。您还想在&lt;h:message&gt; 上检查相同的渲染条件:

    <h:message for="tv" rendered="#{testBean.testValRendered}" />
    <h:inputText id="tv" ... rendered="#{testBean.testValRendered}" />
    

    【讨论】:

    • 很公平,但是如果我使用一个 代替整个表单并且不能有条件地呈现它,那又如何呢?您是说即使组件没有执行,它也正在被处理和验证?
    • 将您的回答标记为已接受,因为它为我最初的问题提供了解决方案。但是,我想我真正希望得到的答案是为什么会发生这种情况,以及是否有任何其他方法可以“正确”地删除消息。请参阅我之前的评论。
    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2018-10-09
    • 2013-11-21
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多