h:selectOneMenu默认项为null,清除空项值,必填字段

时间:2012-06-19 21:04:49

标签: jsf-2 richfaces

您好,我遇到以下问题:

<h:selectOneMenu id="selectTipoAutorizacion"
                                                    value="#{autorizacion.codigoTipoAutorizacion}"
                                                    required="true">
                                                    <f:selectItems
                                                        value="#{cc.attrs.controller.getListaTiposAutorizacion(autorizacion)}"
                                                        var="tipoAutorizacion"
                                                        itemLabel="#{tipoAutorizacion.nombreTipoAutorizacion}"
                                                        itemValue="#{tipoAutorizacion.id.codigoTipoAutorizacion}" />

                                                    <a4j:ajax event="change" execute="@this"
         listener = #{myListener.listener}                                                                                      render="selectAutorizador" />
                                                </h:selectOneMenu>

问题是默认选择的值始终是标记的第一个。这会让用户感到烦恼,因为某些数据是根据所选的项目值加载的......但是,直到更改事件发生时才会加载该信息(a4j:ajax标记),所以现在用户必须选择另一个项目,然后选择前一个,以查看默认的项目相关信息。

我通过在开头加载默认的项目相关信息来解决问题,但是用户不喜欢这个。因为它可能导致混乱。所以问题是......我怎么能避免这种行为?我想要的是selectOneMenu加载一个明确的值(如果没有任何f:selectItems)。非常感谢。

3 个答案:

答案 0 :(得分:8)

您的字段是必填字段,在这种情况下,默认情况下应该没有任何效果。将空的selectItem添加到列表顶部:selectItems.add(0, new SelectItem("", ""));或者这样:<f:selectItem itemValue="" itemLabel="" /> 默认情况下,它会选择空的selectItem。 由于required="true"不允许空选择,用户将被迫做出选择。

答案 1 :(得分:2)

只需在bean的(post)构造函数中预加载所需的数据。

if (codigoTipoAutorizacion != null) {
    // Preload all other desired data as well.
}

答案 2 :(得分:2)

在f:selectItems之前添加一个f:selectItem,其值为空,或类似“请选择...”,并将其标记为不可选择。