0

我有一个表单,其中包含一些具有验证的输入(必需 = 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>

请告知如何解决。

4

1 回答 1

2

JavaScripthistory.back()函数将您带到上一个同步请求,而不是您似乎期望的上一个视图。

尽管history.back()这种方式很糟糕(不可靠、可破解等),但快速解决方法是在表单提交时发送 ajax 请求而不是同步请求。

<h:form>
    ...
    <h:commandButton value="submit">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
</h:form>

Ajax 请求不计入浏览器历史记录。

更健壮的方法是在导航期间仅传递前一个视图的标识符,然后用于<h:link>链接回它。例如

<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 导航,您可能会考虑使用 flash 范围来记住初始视图。


与具体问题无关<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这里的库名只是被路径名替换了。使用名称“图像”作为库名称是非常值得怀疑的。另请参阅JSF 资源库的用途是什么以及应该如何使用它?

于 2012-10-31T00:19:45.480 回答