在JSF表单验证失败后滚动到锚点或页面底部

时间:2012-09-11 22:44:15

标签: jsf

我在页面底部有一个联系表单,其中包含必填和验证的表单字段。如果验证失败,如何将滚动位置返回到页面底部?

我希望此页面能够禁用Javascript,因此没有AJAX解决方案。我有这样的事情:

<a id="contact"></a>
<h:form id="cform">
    <h5>Contact!</h5>

    <h:outputLabel for="name">Name: 
        <h:message id="nameMsg"  for="name" />
    </h:outputLabel>

    <h:inputText id="name" value="#{bean.name}" required="true" requiredMessage="Please enter name!" />

    <h:outputLabel for="email">Email: 
        <h:message id="emailMsg" for="email" />
    </h:outputLabel>

    <h:inputText id="email" value="#{bean.email}" required="true" requiredMessage="Email is required!">
        <f:validator validatorId="myValidator" />
    </h:inputText>

    <h:outputLabel for="comment">Comment: 
        <h:message id="commentMsg" for="comment" />
    </h:outputLabel>

    <h:inputTextarea id="comment" value="#{bean.comment}" required="true" requiredMessage="Please enter a comment!"/>

    <h:commandButton action="#{bean.go}" id="send" value="send" />
</h:form>

我考虑过在bean端进行验证并手动重定向到适当的锚点,但这似乎打败了使用JSF开始的目的。我假设有一种简单的方法可以做到这一点,但我在谷歌搜索解决方案时遇到了麻烦,因为我可能没有正确地写出这个问题。任何人?

3 个答案:

答案 0 :(得分:4)

您可以使用<f:event type="postValidate">在验证阶段之后立即拥有侦听器挂钩。您可以使用FacesContext#isValidationFailed()检查验证是否失败。您可以使用Flash#setKeepMessages()让faces消息在重定向中存活(它们是默认请求作用域!)。您可以使用ExternalContext#redirect()在非操作方法中执行重定向。

总而言之,这应该做到:

<h:form id="cform">
    ...
    <f:event type="postValidate" listener="#{bean.postValidate}" />
</h:form>

使用:

public void postValidate() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();

    if (context.isValidationFailed()) {
        context.getExternalContext().getFlash().setKeepMessages(true);
        context.getExternalContext().redirect("contact.xhtml#cform");
    }
}

答案 1 :(得分:1)

或者我们可以使用 f:ajax onerror = 来做错误的事情:

 <p:commandButton **>
  <f:ajax onerror="window.scrollTo(0, 0);" />
 </p:commandButton>

答案 2 :(得分:0)

您不需要显式的锚标记,表单的ID也可以。

您可以让Faces在表单操作Url。

的末尾呈现id

例如

...您的主页内容就在这里......

<form id="contact-form" action="/MyView.jsf#contact-form" method="post">

这将导致浏览器在提交后滚动到表单。

它也在Url中显示。

您可以实现自定义表单渲染器来执行此操作。