2

我有一个选择列表,每次使用时都需要提供一个值,并且在未输入值时required我使用它来显示一条消息。requiredMessage但是它们都不适用于我的选择列表,如下所示:

<p:pickList value="#{parameterValueDialog.selectedModelSeries}"
            var="item" itemValue="#{item}" required="true"
            converter="pickListConverter" requiredMessage="#{msg.validation_message}">

有谁知道如何解决这个问题?这是 Primefaces 库本身的问题吗?

编辑:发布getAsObject()方法

@Override

public final Object getAsObject(final FacesContext ctx, final UIComponent component, final String string) {

Object returnObject = null;
Object dualList = ((PickList) component).getValue();
DualListModel<Item<?>> listModel = (DualListModel<NamedItem<?>>) dualList;
for (Item<?> item : listModel.getSource()) {
    String id = String.valueOf(item.getId());
    if (string.equals(id)) {
        returnObject = item;
        break;
        }
    }
    if (returnObject == null) {
        for (Item<?> item : listModel.getTarget()) {
            String id = String.valueOf(item.getId());
            if (string.equals(id)) {
                returnObject = item;
                break;
            }
        }
    }

return returnObject;

}

4

1 回答 1

2

您可以通过提供在您的pickList 中使用的验证器方法来解决您的问题。

就我而言,我的目标列表包含成员名称,我必须确保该列表包含至少一个成员并且第一个成员具有特殊状态。您首先必须将 pickList 返回的对象转换为 DualListModel 并掌握目标列表。然后,您可以检查它是否为空并执行所需的任何其他验证。这是我的验证器方法:

public void valideLocationsResponsables(FacesContext contexte, UIComponent composant, Object locationResps) throws ValidatorException {
    DualListModel<LocationsResponsables> dualListModel;
    if (locationResps instanceof DualListModel) {
        dualListModel = (DualListModel<LocationsResponsables>) locationResps;
        List<LocationsResponsables> listeResponsables = dualListModel.getTarget();
        ListIterator<LocationsResponsables> iterateur = listeResponsables.listIterator();
        // Your validation criteria here
        if (listeResponsables.isEmpty() || !iterateur.next().getIdMembreReserv().getStatut().isPeutReserver()) {
            ((UIInput) composant).setValid(false); // Pick list is made invalid
            FacesMessage msgErreur = new FacesMessage();
            msgErreur.setSeverity(FacesMessage.SEVERITY_ERROR);
            msgErreur.setDetail("Your error message here");
            throw new ValidatorException(msgErreur);
        }
    }
}

验证器方法使用验证器关键字连接到pickList,如下所示:

        <p:pickList id="listeResp" value="#{locationsControleur.locationsResponsablesListe}" var="resp" effect="puff"
                            itemValue="#{resp}" itemLabel="#{resp.idMembreReserv.prenomNom}"
                            converter="#{locationsResponsablesListeConvertisseur}"
                            validator="#{locationsControleur.valideLocationsResponsables}">
                <f:facet name="sourceCaption">#{msgs.LocationsMembresEligibles}</f:facet>
                <f:facet name="targetCaption">#{msgs.LocationsResponsablesChoisis}</f:facet>
        </p:pickList>
                <p/><p/>
                <h:message id="listeRespMsg" for="listeResp" errorStyle="color: red"/>

希望这能有所帮助。

于 2014-01-31T04:13:15.140 回答