如何在回发后保留f:viewParam值并且验证失败

时间:2012-09-07 08:01:51

标签: validation jsf jsf-2 postback viewparams

我有简单形式的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。我做错了什么?我怎样才能通过这个参数?

感谢您浪费时间。

1 个答案:

答案 0 :(得分:3)

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

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

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

或者,您可以使用<o:form>OmniFaces JSF utility library,它基本上使用附加属性<h:form>扩展includeViewParams,这样您就可以保留视图参数表单操作URL中的后续请求。

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

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