【问题标题】:Creating Dropdown Box using AJAX with JSF/Primefaces使用 AJAX 和 JSF/Primefaces 创建下拉框
【发布时间】:2013-02-08 01:13:12
【问题描述】:

我正在尝试使用 Ajax 和 JSF 2.0/primeface 创建一个简单的下拉框。基于 First Dropdown 选择,第二个下拉框使用 AJAX 调用填充。

当我选择第一个下拉列表时,它会根据 Ajax 调用正确填充第二个下拉框。但是当我在第二个下拉列表中进行选择并单击按钮{基本上提交表单以进行某些操作}时,它会给出错误消息 "formViewBusinessCode:selectedBusinessCode: 验证错误:值无效"

当我签入控制台时,“selectedBusinessCode”{Id of second dropdown} 的值为 null。我很困惑,因为它正确填充但只有在选择后它才会给出错误值无效(基本上为空),为什么选择的值没有到达 bean?有人可以指出我在这里缺少的东西吗,TIA

xhtml代码如下

<h:outputText styleClass="outputText" value="#{constant.businessCodeGroup}"></h:outputText>
<h:selectOneMenu id="selectedBusinessCodeGroup" value="#{viewBusinessCodeBean.selectedBusinessCodeGroup}" >
    <f:selectItem itemValue="SELCT" itemLabel="Select Business Code Group" />
    <f:selectItems value="#{viewBusinessCodeBean.businessCodeGroupList}" />
    <p:ajax listener="#{viewBusinessCodeBean.getOnlyBusinessCodeListByAjaxCall}" event="change" update="selectedBusinessCode" process="@this"/>
</h:selectOneMenu> 

<h:outputText styleClass="outputText" value="#{constant.businessCode}"></h:outputText>
    <h:selectOneMenu id="selectedBusinessCode" value="#{viewBusinessCodeBean.selectedBusinessCode}">
    <f:selectItem itemValue="SELCT" itemLabel="Select Business Code" />
    <f:selectItems value="#{viewBusinessCodeBean.businessCodeList}" itemLable="#{viewBusinessCodeBean.businessCodeList.getlable}"
    itemValue="#{viewBusinessCodeBean.businessCodeList.getValue}" />
</h:selectOneMenu>

<h:commandButton value="View" action="#{viewBusinessCodeBean.getOnlyBusinessCodeDescription}"></h:commandButton>

bean 编码如下。它是一个@ManagedBean

填充第一个下拉框

public ViewBusinessCodeBean() {
    logger.entering(CLASS_NAME);
    this.businessCodeGroupList = new ArrayList<SelectItem>();
    List<String>tempBusinessCodeList = new BusinessCodeTableServices().getBusinessCodeGroupList();
    Iterator<String>iterator = tempBusinessCodeList.iterator();
    while(iterator.hasNext()){
        String businessCodeGroup = iterator.next();
        logger.debug(businessCodeGroup);
        SelectItem item = new SelectItem(businessCodeGroup);
        businessCodeGroupList.add(item);
    }
    logger.exiting(CLASS_NAME);
}

填充第二个下拉列表的 Ajax 调用方法

public void getOnlyBusinessCodeListByAjaxCall() {
    this.businessCodeList = new ArrayList<SelectItem>();
    List<String>tempBusinessCodeList = new BusinessCodeTableServices().getOnlyBusinessCodeList(getSelectedBusinessCodeGroup());
    Iterator<String>iterator = tempBusinessCodeList.iterator();
    while(iterator.hasNext()){
        String businessCode = iterator.next();
        SelectItem item = new SelectItem(businessCode,businessCode,businessCode);
        businessCodeList.add(item);
    }   
}

【问题讨论】:

    标签: ajax jsf-2 primefaces


    【解决方案1】:

    您的 bean 显然在请求范围内。请求范围的 bean 会在每个请求上重建,所有属性都设置为默认值。您的验证错误是因为在处理表单提交的请求期间businessCodeList 属性已变为null/empty。

    将 bean 放在视图范围内应该可以解决这个问题。

    另见:

    【讨论】:

    • 谢谢。它解决了这个问题,但它给了我 java.io.NotSerializableException 的另一个问题:通过将上下文保留在 web.xml org.apache.myfaces.SERIALIZE_STATE_IN_SESSION 中解决了这个问题名称> false
    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多