4

我有简单形式的 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!"/>

尝试接受没有输入文本的表单后,我无法恢复视图参数。我尝试使用隐藏输入来传递参数

<h:inputHidden id="page" value="#{itemsBean.page}" />

,但似乎验证运行之前和 itemsBean.page 仍然是空的。itemsBean 是 RequestScoped。我做错了什么?我怎样才能传递参数?

谢谢你浪费你的时间。

4

1 回答 1

3

您需要不断将请求参数传递给后续请求。在“plain vanilla” HTML 中,您确实会使用<input type="hidden">它,但<h:inputHidden>不幸的是 JSF 不能那样工作。如果由于另一个输入字段导致一般验证失败,则与之关联的模型值<h:inputHidden>将根本不会更新。

您应该<f:param>UICommand组件中使用 a 来保留后续请求的请求参数。例如

<h:commandButton ...>
    <f:param name="page" value="#{param.page}" />
</h:commandButton>

或者,您可以使用<o:form>OmniFaces JSF 实用程序库,它基本上扩展了<h:form>一个附加属性includeViewParams,使您能够在表单操作 URL 中保留后续请求的视图参数。

<o:form includeViewParams="true">
    ...
</o:form>

如果您有多个命令按钮/链接和 ajax 操作,这最终可能会更容易,这将是您希望在非 ajax 回发期间保留相同 URL 的唯一方法。

于 2012-09-07T12:29:51.620 回答