如果验证错误,取消按钮不起作用

时间:2012-10-30 22:35:15

标签: jsf jsf-2

我有一个带有一些输入验证的表单(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>

请告知如何解决这个问题。

1 个答案:

答案 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?