验证ViewParam和a4j:commandButton

时间:2013-01-07 10:57:04

标签: jsf ajax4jsf commandbutton

我认为我遇到了@ViewScoped a4j:commandButton的错误。

我有一个非常复杂的表单,其中所有操作都使用a4j,除了需要上传数据的那些。 并且根据命令的顺序,viewParam的验证会中断。

以下是工作代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j" >

  <f:metadata>
    <f:viewParam id="viewParam" name="viewParam" value="#{bean.viewParam}" required="true" />
  </f:metadata>
  <h:head>
    <title>Test View Param</title>
  </h:head>
  <h:body>
    <h:message for="viewParam" />
    <hr/>
    <h:form>
      #{bean.viewParam}<br/>
      <h:commandButton value="cmdButton" />
      <a4j:commandButton value="a4jBtn" execute="@this" render="@form" />
    </h:form>  
  </h:body>
</html>

只需点击a4jBtn,然后点击cmdButton即可查看问题。 你会看到参数仍在那里!但验证失败了。

<t:saveState>没有帮助, <rich:message>也不是更好,但

<h:commandButton value="ajaxBtn" ><f:ajax execute="@this" render="@form" /></h:commandButton>

而不是

<a4j:commandButton value="a4jBtn" execute="@this" render="@form" />

工作正常!

在Tomcat 6.0.18和jboss-el 2.0.0.GA上使用myFaces 2.0.15和richFaces 4.2.3.Final。

我可以使用f:ajax代替a4j:commandButton解决我的问题,但也许您有更好的想法,或者您可以向我解释出现了什么问题?

1 个答案:

答案 0 :(得分:1)

您基本上需要在同步回发上保留视图参数。当您使用OmniFaces时,可以使用<o:form>

<o:form includeViewParams="true">

或者,由于您已经在使用视图范围的bean,因此仅在非回发时触发验证。

<f:viewParam ... required="#{not facesContext.postback}" />

或者,当您使用OmniFaces时,可以使用<o:viewParam>代替跳回验证/转换/更新。

<o:viewParam ... />