我在页面底部有一个联系表单,其中包含必填和验证的表单字段。如果验证失败,如何将滚动位置返回到页面底部?
我希望此页面能够禁用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开始的目的。我假设有一种简单的方法可以做到这一点,但我在谷歌搜索解决方案时遇到了麻烦,因为我可能没有正确地写出这个问题。任何人?
答案 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中显示。
您可以实现自定义表单渲染器来执行此操作。