2016-04-01 8 views
0

Ich möchte ausgewählte Werte nach der Formularvalidierung beibehalten. Mein Code ist hier:p: selectOneMenu behält den Wert nach der Formularvalidierung nicht

<h:form id="advanceSearchForm"> 
    <p:dataGrid value="#{advancedSearchBean.selectedCriteriasList}" id="advancedSearchGrid" var="criteria" rowIndexVar="rowIndex" 
     columns="2" layout="grid" paginator="false" > 
     <h:panelGrid columns="1" id="criteriaPanel"> 
      <p:panel id="criteria"> 
       <div> 

        <!-- select criteria --> 
        <p:selectOneMenu value="#{criteria}" label="#{criteria.name}" 
          valueChangeListener="#{advancedSearchBean.addNewCriteria}" 
          converter="#{advancedSearchBean.criteriaConverter}"> 
           <f:selectItems value="#{advancedSearchBean.criterias}" 
            var="crt" 
            itemLabel="#{crt.name}" 
            itemValue="#{crt}" 
            itemDisabled="#{advancedSearchBean.disableItem(crt.id)}" /> 
           <f:ajax execute="@this"/> 
        </p:selectOneMenu> 

        <!-- launch date --> 
        <p:outputPanel rendered="#{criteria.id != null and (criteria.id == BusinessConstants.ADVANCED_SEARCH_FILTER_LAUNCH_DATE_ID)}"> 
          <p:outputPanel> 
           <h:outputText value="From" styleClass="passportLabel" /> 
           <p:inputMask required="true" id="launchStartDate" value="#{advancedSearchBean.launchStartDate}" mask="99/9999"> 
            <f:convertDateTime pattern="MM/yyyy" timeZone="#{sessionScope.identity.timezone}" /> 
            <p:ajax event="change" listener="#{advancedSearchBean.changeLaunchStartDate()}" /> 
           </p:inputMask> 
          </p:outputPanel> 
          <p:outputPanel> 
           <h:outputText value="To" styleClass="passportLabel" /> 
           <p:inputMask required="true" id="launchEndDate" value="#{advancedSearchBean.launchEndDate}" mask="99/9999"> 
            <f:convertDateTime pattern="MM/yyyy" timeZone="#{sessionScope.identity.timezone}" /> 
            <p:ajax event="change" listener="#{advancedSearchBean.changeLaunchEndDate()}" /> 
           </p:inputMask> 
          </p:outputPanel> 
        </p:outputPanel> 


       </div> 
      </p:panel> 
     </h:panelGrid> 
    </p:dataGrid> 

    <!-- run search button --> 
    <div> 
     <p:commandButton id="runAdvancedSearch" value="Run search" action="#{advancedSearchBean.doAdvancedSearch}" 
      update="advanceSearchForm:advancedSearchGrid"/> 
    </div> 
    </h:form> 

Wenn ich ein falsches Datum tippen bin, und klicken Sie auf die Schaltfläche Suchen, ich bin meine Validierung Fehlermeldung bekommen, und ich bin auch der ausgewählte Wert in der selectOneMenu zu verlieren.

Das Merkwürdige ist, dass, wenn auf eine andere Seite umgeleitet und nach, dass ich komme wieder, es funktioniert ... Meine Bohne ist:

@ManagedBean(name = "advancedSearchBean") 
@ViewScoped 
public class AdvancedSearchBean { 

private Map<Long, String> criteriaMap; 
private List<AutocompleteCriteria> criterias; 
private List<AutocompleteCriteria> selectedCriteriasList; 

@PostConstruct 
public void init() { 
    criteriaMap = BusinessConstants.ADVANCED_SEARCH_CRITERIA.entrySet().stream().sorted(Entry.comparingByValue()). 
      collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); 
    criterias = new ArrayList<AutocompleteCriteria>(); 
    for(Iterator<Map.Entry<Long, String>>it = criteriaMap.entrySet().iterator();it.hasNext();){ 
     Map.Entry<Long, String> entry = it.next(); 
     criterias.add(new AutocompleteCriteria(entry.getKey(), entry.getValue())); 
    } 
    criteriaConverter = new AutocompleteConverter(criterias); 
    selectedCriteriasList = new ArrayList<AutocompleteCriteria>(); 
    selectedCriteriasList.add(new AutocompleteCriteria(BusinessConstants.ADVANCED_SEARCH_FILTER_NO_CRITERIA, criteriaMap.get(BusinessConstants.ADVANCED_SEARCH_FILTER_NO_CRITERIA))); 
} 
+0

So ein h: selectOneMenu funktioniert? Und wenn Sie möchten, dass wir versuchen zu replizieren, schreiben Sie bitte ein [mcve]. Siehe auch [ask] und http://www.stackoverflow.com/tags/jsf/info, welche Informationen ebenfalls zur Verfügung gestellt werden. – Kukeltje

+0

h: selectOneMenu funktioniert auch nicht. Ich bearbeitet den Code, um einfacher zu lesen, danke –

+0

es geht nicht um 'einfach' es geht um [mcve] – Kukeltje

Antwort

0

In Ihrem p:selectOneMenu Sie haben value="#{criteria}" statt value="#{advancedSearchBean.criteria}".

+0

Kriterien ist die Variable aus dem Datagrid, die Wert = "# {advancedSearchBean.selectedCriteriasList}" und var = "Kriterien" –