0

我有一个简单的表格。

<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 下发生。

4

1 回答 1

0

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

如果您确实需要保留 2 个物理上不同视图的这种奇怪方法,那么最好的办法是将 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}视图范围。

也可以看看:

于 2013-08-07T11:43:39.850 回答