2014-03-12 38 views
0

JSF 2.includeViewParams在驗證後不會設置值

一個帶有單個輸入的簡單表單,它經過驗證。使用o:表單試圖解決問題。

<f:view> 
    <f:metadata> 
     <f:viewParam name="info2" value="#{myClass.info2}" /> 
     <f:viewParam name="info1" value="#{myClass.info1}" /> 
     <f:event listener="#{myClass.init(}" type="preRenderView" /> 
    </f:metadata> 
    <o:form includeViewParams="true"> 
     <h:outputText value="Enter some info for #{myClass.info1}" /> 
     <h:inputText id="input" value="#{myClass.info3}" 
     validator="myValidator" /> 
     <br /> 
     <h:commandButton action="#{myClass.action()}" value="Enter some info" /> 
     <br /> 
     <h:message for="input" /> 
     <br /> 
     <h:outputText value="#{myClass.info2}" /> 
    </o:form> 
</f:view> 

與此URL

http://localhost:8080/test/test.xhtml?info1=hello&info2=there 

當我在輸入字段中放一個值,驗證失敗調用時,頁面回來與 相同的URL,但兼具myClass.info1和MyClass的.info2設置爲空。 這個URL很好,但是如果這些參數不是在 bean中設置的,那麼它的效果並不好。

這是爲什麼,如何解決?

+0

考慮使用f:ajax作爲commandButton和o:viewParam而不是f:viewParam –

+0

我意識到這篇文章是一個更好的渲染問題http://stackoverflow.com/questions/16187049/retain-original-get- request-parameters-across-postbacks。我現在可以撤回這個問題嗎? – april26

回答

1

不幸的是,這是預期的行爲。如果驗證階段失敗,則不會執行更新模型值階段。這不僅適用於表單的輸入字段,還適用於相同請求中涉及的視圖參數!顯然,你的bean是請求作用域,然後在初始請求期間設置的視圖參數確實會丟失。

最好的辦法是使託管bean代替@ViewScoped,而使用<o:viewParam>代替僅在初始GET請求期間設置視圖參數。當Faces#isPostback()返回true時,您可能只需更改init()方法以跳過該作業。