这个问题在这里已经有了答案:
Retaining GET request query string parameters on JSF form submit
(2 个回答)
5年前关闭。
我有简单形式的 xhtml 页面。此页面用于多个数据表。为了指定数据表(等等),我使用 GET 请求参数。 xhtml页面通过
<f:metadata>
<f:viewParam id="page" name="page" value="#{itemsBean.page}"/>
</f:metadata>
并再次通过导航规则,如
<navigation-case>
<description>
Global rule for going to the items page from any page
</description>
<from-outcome>items</from-outcome>
<to-view-id>/items.xhtml</to-view-id>
<redirect>
<view-param>
<name>page</name>
<value>#{itemsBean.page}</value>
</view-param>
</redirect>
</navigation-case>
但是如果我像这样在 xhtml 文件中使用输入
<h:inputText id="itemName" value="#{itemsBean.name}"
required="true" requiredMessage="Value for this field required!"/>
尝试接受没有输入文本的表单后,我无法恢复 View 参数。
我尝试使用隐藏输入来传递参数
<h:inputHidden id="page" value="#{itemsBean.page}" />
,但似乎验证运行之前和 itemsBean.page 仍然是空的。 itemsBean 是 RequestScoped。我做错了什么?我怎样才能传递参数?
谢谢你浪费你的时间。
最佳答案
您需要不断将请求参数传递给后续请求。在“普通”HTML 中,您确实会使用 <input type="hidden">
为此,但 JSF <h:inputHidden>
不幸的是不能那样工作。如果由另一个输入字段引起的一般验证失败,则与 <h:inputHidden>
关联的模型值根本不会更新。
您应该使用 <f:param>
在 UICommand
组件而不是为后续请求保留请求参数。例如。
<h:commandButton ...>
<f:param name="page" value="#{param.page}" />
</h:commandButton>
或者,您可以使用
<o:form>
的OmniFaces JSF utility library ,它基本上扩展了 <h:form>
带有附加属性 includeViewParams
这使您能够在表单操作 URL 中保留后续请求的 View 参数。<o:form includeViewParams="true">
...
</o:form>
如果您有多个命令按钮/链接和 ajax 操作,这最终可能会更容易,如果您想在非 ajax 回发期间保留相同的 URL,这将是唯一的方法。
关于validation - 如何保留 f :viewParam values after postback with validation failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12314081/