1

我有一个标准的 JSF h:form,其中包含一个 h:SelectOneMenu 控件。只要我从呈现页面时填充的列表中选择一个项目,它就可以完美地工作。我认为这并不重要,但将其放在上下文中,选择的值用于构建返回匹配记录列表的查询。

我已经在控件上实现了 JQuery 自动完成框,只要我选择其中一个原始值,它仍然可以正常工作。

当我在呈现页面时输入不在选择控件中的值时,就会出现问题。使用 JQuery,我对其进行了设置,以便当输入不在列表中的值时,将该值作为新选项添加​​到选择中。

我可以验证该选项是否已添加到底层选择控件,并通过 javascript 进行选择。但是,当在这之后立即在支持 bean 中调用 setter 时,传入 setter 的值为 null,并且永远不会到达运行查询的函数。AJAX 响应中返回以下错误,但我还没有找到验证值的位置。它也不是必填字段。

验证错误:值无效

这是我的前端代码:

   <h:selectOneMenu id="make" styleClass="combobox" value="#{listBean.make}" 
                     effect="fade" label="#{listBean.makeLabel}" >
      <f:selectItems value="#{listBean.makeList}" />
   </h:selectOneMenu>

以及 bean 中的设置器:

    public void setMake(String make) {
       this.make = make;
    }

我猜我只需要找到一种方法将新选项包含在支持 bean 的 makeList 列表中,但我不知道该怎么做。任何帮助或建议将不胜感激。

Java EE 6、GlassFish 3.1、Eclipse 3.7 - 在 FireFox 和 Chrome 上都观察到问题

4

1 回答 1

1

您需要通过 提供动态添加的项目<f:selectItems>,而不是通过 JavaScript。如果该项目不存在于 中<f:selectItems>,那么您将得到这个验证错误。这样做是为了防止篡改/黑客请求试图将非法/未提供的值输入服务器端。

更简单的是使用 JSF 组件库。例如,PrimeFaces 有一个<p:autoComplete>确切的用途。

于 2012-07-13T03:38:02.713 回答