我有一个简单的表格。
<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中不会发生。
答案 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}
是视图范围。