视图范围bean上的提交值不会出现在POST导航的页面中

时间:2013-08-06 16:49:03

标签: jsf jsf-2

我有一个简单的表格。

<h:form>
   <h:selectOneMenu value="#{user.siteID}" >
       <f:selectItems id="vals" value="#{user.basinSiteIDs}" /> 
       <f:ajax event="valueChange" listener="#{user.updateWithAjax(e)}"
                render="all" />
   </h:selectOneMenu>
   <h:selectManyCheckbox id="all" value="#{user.siteIDs}" layout="pageDirection">
       <f:selectItems id="sites" value="#{user.csrpSites}" />
   </h:selectManyCheckbox>
   <h:commandButton value="submit" action="result"/>
</h:form>

页面最初加载下拉列表并带有关联值的复选框。当我从下拉列表中进行选择时,复选框值将使用ajax动态更改。我需要单击“提交”按钮并在结果页面中显示用户选择的值。

问题在于: 如果我使用@RequestScoped,则点击提交按钮会显示j_idt7:all: Validation Error: Value is not valid

@ViewScoped,带到结果页面,但带有空/空值。

@SessionScoped,显示具有正确值的结果页面,但当我单击浏览器的后退按钮并登陆索引页面时,它们就消失了。这种情况仅在IE和Chrome下发生,但在Firefox中不会发生。

1 个答案:

答案 0 :(得分:0)

@ViewScoped是一个正确的范围,目的是拥有一个由ajax填充的依赖下拉列表。您的具体问题是由于某种原因将一个相同的视图范围bean绑定到2个物理上不同的视图引起的。只要视图本身,视图范围内的bean就会存在。如果您更改视图,那么您将获得一个新的视图范围bean。如果你在同一个视图中显示了结果,那么它就可以正常工作了。

如果你真的需要保持两种不同视图的奇怪方法,那么最好的办法就是将豆子分成两部分:

<h:selectOneMenu id="basin" value="#{user.basinSiteID}" >
    <f:selectItems value="#{data.basinSiteIDs}" /> 
    <f:ajax listener="#{data.loadCsrpSiteIDs}" render="csrp" />
</h:selectOneMenu>
<h:selectManyCheckbox id="csrp" value="#{user.csrpSiteID}" layout="pageDirection">
    <f:selectItems value="#{data.csrpSiteIDs}" />
</h:selectManyCheckbox>
<h:commandButton value="submit" action="result"/>

(请注意,我在这里做了一些改进,你的初始代码有点脏,特别是传递ajax行为事件的尝试是完全错误的,它将以null

#{user}此处是请求范围,#{data}是视图范围。

另见: