我有一个带有一些输入验证的表单(required = true) 当我在验证错误的情况下单击取消按钮时,取消按钮不会导航到上一页,而是删除验证错误(我认为它会回到验证错误之前的一步?)
这是我的代码:
<h:form>
<h:inputText value="#{myBean.nickName}" id="nickname" required="true"
requiredMessage="nickname should be specified" />
<h:commandLink immediate="true" id="cancel_link" onclick="history.back(); return false" style="float: left;margin: 118px 189px 0 0;">
<h:graphicImage width="90" height="28" value="#{resource['images:blu_btnCancel.png']}" />
</h:commandLink>
</h:form>
请告知如何解决这个问题。
答案 0 :(得分:2)
JavaScript history.back()
函数将您带到上一个同步请求,而不是您所期望的上一个视图。
即使history.back()
这种方式很糟糕(不可靠,黑客等),快速解决方法是在表单提交而不是同步请求上发送ajax请求。
<h:form>
...
<h:commandButton value="submit">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
</h:form>
Ajax请求不会被视为浏览器历史记录。
更健壮的方法是在导航过程中传递上一个视图的标识符,然后使用<h:link>
链接回来。 E.g。
<h:link value="Go to next view" outcome="nextview">
<f:param name="from" value="#{view.viewId}" />
<h:link>
然后在nextview.xhtml
<f:metadata>
<f:viewParam name="from" />
</f:metadata>
...
<h:link ... outcome="#{from}" rendered="#{not empty from}">
<h:graphicImage ... />
</h:link>
如果您通过POST导航,可以考虑使用闪存范围来记住初始视图。
无关,使用<h:graphicImage>
与JSF2资源的正确方法是仅使用其name
属性而不是其value
属性一个#{resource}
,这显然很笨拙。
替换
<h:graphicImage width="90" height="28" value="#{resource['images:blu_btnCancel.png']}" />
通过
<h:graphicImage name="images/blu_btnCancel.png" width="90" height="28" />
请注意,库名images
在此处仅替换为路径名。使用名称“images”作为库名称是非常值得怀疑的。另请参阅What is the JSF resource library for and how should it be used?